当您处理大文件时,读取线非常慢。我从谷歌找到的一般建议是使用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"
答案 0 :(得分:2)
它缓慢的原因是因为它每次迭代都运行多个进程:
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")
也就是说,html
不应逐行追加到awk
,而应生成整个内容。在单个awk
进程中,您可以执行非常强大的文本处理,这将比shell中的几个echo
,tr
等更高效。
我的示例不包含stopList
,因为您没有解释它的作用。无论它做什么,您都需要在awk
内实现它,以便它可以在同一个awk
进程中运行。那么你的脚本将比当前的逐行while
循环快得多。