更快 bash 写入文件

Faster bash writing to file

我正在读取 bash 中的文件,取出值并将它们保存到另一个文件中。 该文件包含约 100k 行,读取和重写它们大约需要 25 分钟。

是否有更快的写入文件的方法,因为现在我只是遍历行,解析一些值并像这样保存它们:

while read line; do
   zip="$(echo "$line" | cut -c 1-8)"
   echo $zip
done < file_one.txt

一切正常,值被正确解析,我只想知道如何优化流程(如果我能的话)。

谢谢

bash 循环只会减慢它的速度(尤其是每次迭代调用一次外部程序 (cut) 的部分)。您可以一次性完成所有操作 cut:

cut -c 1-8 file_one.xt

如果您希望在满足某些条件时对行的子字符串进行操作,Awk 是为处理文本文件而构建的:

awk '{zip=substr([=10=], 1, 8)} zip == "my match" {print zip}' file_one.txt

在此示例中,substr([=11=], 1, 8) 表示 file_one.txt 的每行记录 ([=12=]) 的字符 1 到 8。这些子串被赋值给zip变量,只有在匹配文本"my match".

时才会打印

如果您不熟悉 Awk,并且经常需要操作大文件,我建议您花一些时间来学习它。 Awk 比 bash 读取循环加载速度更快、效率更高。博客 post - Awk in 20 Minutes - 是一个很好的快速介绍。

要节省更多处理大文件的时间,您可以使用名为 Mawk 的 Awk 优化速度版本。

每行调用一次 cut 是一个很大的瓶颈。使用子字符串扩展来获取每行的前 8 个字符。

while read line; do
   zip=${line:0:8}
   echo $zip
done < file_one.txt

我会接受这个,因为它只执行一次剪切:

while read line; do
   echo $line
done < <(cut -c 1-8 file_one.txt)