而处理大文件时,读取行非常慢。我从谷歌找到的一般建议是使用 awk,但是如何将以下while
转换为awk
?
while read r; do
html[$dId]+=$(echo -e "n$r")
stopList $(echo -e "$r" | tr -d ' ') all
done <<< "$list"
我尝试过什么
awk '{
html[$dId]+=$(echo -e "n$0")
stopList $(echo -e "$0" | tr -d ' ') all
}' <<< "$list"
它很慢的原因是因为它每次迭代运行多个进程:
while read r; do
html[$dId]+=$(echo -e "n$r")
stopList $(echo -e "$r" | tr -d ' ') all
done <<< "$list"
有:2个回声,一个tr
,和stopList
函数,我们甚至不知道它的作用。
要将其转换为awk
您需要重新考虑一下,如下所示:
html[$dId]=$(awk '{ printf("n%s", $0) }' <<< "$list")
也就是说,awk
应该生成整个事情,而不是逐行追加到html
。在单个awk
进程中,您可以进行非常强大的文本处理,这将比 shell 中的几个echo
、tr
s等更有效。
我的例子不包括stopList
,因为你没有解释它的作用。无论它做什么,你都需要在awk
中实现它,以便它可以在同一个awk
进程中运行。然后你的脚本将比当前的逐行while
循环快得多。