将读取行转换为awk

时间:2014-01-21 20:47:08

标签: linux bash awk while-loop

当您处理大文件时,读取线非常慢。我从谷歌找到的一般建议是使用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"

1 个答案:

答案 0 :(得分:2)

它缓慢的原因是因为它每次迭代都运行多个进程:

while read r; do
    html[$dId]+=$(echo -e "\n$r")
    stopList $(echo -e "$r" | tr -d ' ') all
done <<< "$list"

有2个回声,trstopList函数,我们甚至不知道它的作用。

要将其转换为awk,您需要重新考虑一下,如下所示:

html[$dId]=$(awk '{ printf("\n%s", $0) }' <<< "$list")

也就是说,html不应逐行追加到awk,而应生成整个内容。在单个awk进程中,您可以执行非常强大的文本处理,这将比shell中的几个echotr等更高效。

我的示例不包含stopList,因为您没有解释它的作用。无论它做什么,您都需要在awk内实现它,以便它可以在同一个awk进程中运行。那么你的脚本将比当前的逐行while循环快得多。