理解 AWK 中的管道

理解 AWK 中的管道

我在 Brian Kernighan 的讲座中找到了这个例子。将两列表格中的食品价格加在一起

#!/usr/bin/awk -f

{amount[$1] += $2}

END {for (name in amount)
           print name, amount[name] | "sort -k1 "
     print "Finished processing everything!"
        }

最后的打印语句print "Finished...."是我自己的小补充。

对于输入

pizza 200
beer 100
pizza 500
beer 50

它产生输出

Finished processing everything!
beer 150
pizza 700

即它将啤酒和披萨的价格加在一起。我不明白的是,我添加的最后一个打印语句是如何在 for 循环之前执行的。

另外,为什么该| sort...语句在循环内for?难道它不应该在 for 循环之后,在完成所有打印之后,就像在 bash 命令行上通过 执行相同操作一样吗 cat file | sort

答案1

特警(1P)有一个关于Output Statements

awk管道中创建一个流,该流保持打开状态,直到您将其关闭。这允许它在循环中使用。使用您的示例:

{amount[$1] += $2}
END {
    for (name in amount)
        print name, amount[name] | "sort -k1"
    close("sort -k1")
    print "Finished processing everything!"
}

这将关闭sort -k1,并允许其被打印。

相关内容