我在 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
,并允许其被打印。