gpt4 book ai didi

linux - Awk:循环并将不同的行保存到不同的文件中?

转载 作者:太空宇宙 更新时间:2023-11-04 04:36:55 25 4
gpt4 key购买 nike

我正在使用 shell 脚本循环访问一系列大文件:

i=0
while read line
do

# get first char of line
first=`echo "$line" | head -c 1`

# make output filename
name="$first"
if [ "$first" = "," ]; then
name='comma'
fi
if [ "$first" = "." ]; then
name='period'
fi

# save line to new file
echo "$line" >> "$2/$name.txt"

# show live counter and inc
echo -en "\rLines:\t$i"
((i++))

done <$file

每行中的第一个字符要么是字母数字,要么是上面定义的字符之一(这就是我重命名它们以在输出文件名中使用的原因)。

速度太慢了。

5,000 行需要 128 秒。

按照这个速度,我已经完成了一个月的处理。

awk 会更快吗?

如果是这样,我如何将逻辑放入 awk 中?

最佳答案

这当然可以在 bash 中更有效地完成。

举个例子:echo foo | headfork()调用,创建子shell,设置管道,启动外部 head程序...而且根本没有理由。

如果您想要一行的第一个字符,而不需要对子进程进行任何低效的处理,就这么简单:

c=${line:0:1}

我还会认真考虑对您的输入进行排序,因此您只能在看到新的第一个字符时重新打开输出文件,而不是每次都通过循环。

也就是说,使用 sort 进行预处理(例如将 <$file 替换为 < <(sort "$file") ),并在每次循环中执行以下操作,仅有条件地重新打开输出文件:

if [[ $name != "$current_name" ]] ; then
current_name="$name"
exec 4>>"$2/$name" # open the output file on FD 4
fi

...然后附加到打开的文件描述符:

printf '%s\n' "$line" >&4

(不使用 echo,因为如果您的行是 -e-n ,它可能会出现不良行为)。

或者,如果可能的输出文件数量很小,您可以预先在不同的 FD 上打开它们(在我选择的位置替换其他更大的数字 4 ),并有条件地输出到这些预先打开的文件之一。打开和关闭文件都很昂贵——每个close()强制刷新到磁盘——所以这应该是一个很大的帮助。

关于linux - Awk:循环并将不同的行保存到不同的文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10604480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com