如何设置for循环的顺序

时间:2014-01-25 14:52:47

标签: awk gawk

我知道,

$ awk '{ a[$0] } END{for (i in a)print i }' <(echo -e "bar\nfoo")
foo
bar

我还尝试了其他输入文件,这些for循环的运行顺序似乎是随机的。

你怎么说awk:保留文件中的顺序,所以这里应该是,

bar
foo

谢谢,

Eric J.

2 个答案:

答案 0 :(得分:3)

您需要自己跟踪订单。在这种情况下,这很简单:

awk '{a[NR] = $0} END { for( i=1; i<= NR; i++ ) print a[i]}'

awk中的数组是关联的,因此数组中的索引可以是任意字符串。因此,索引上没有自然顺序,因此(i in a)语法按实现确定的顺序返回索引。也就是说,该语言不对订单施加要求,并且实现使用它想要存储数据的任何数据结构并以最方便的方式遍历该数据结构。所以不同版本的awk可能会提供不同的顺序。订单不是随机的,但如果不了解底层实施,就无法轻易预测。通过对索引使用整数,您可以控制顺序。

答案 1 :(得分:1)

请参阅@ WilliamPursell对此特定案例的回答,但也请参阅GNU awk手册(http://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal),了解如何设置in运算符的评估顺序。