AWK:为什么for循环首先采用第二个参数?

时间:2014-03-19 10:11:27

标签: for-loop awk split

有人能解释一下这种行为吗?

$ echo "A_B_C_D" | awk '{split($0,a,"_"); for (i in a) {print i,a[i]}}'
2 B
3 C
4 D
1 A

相同
$ awk '{split("A_B_C_D",a,"_"); for (i in a) {print i,a[i]}}' empty
2 B
3 C
4 D
1 A

其中empty是包含一行的文件。

然而,这有效:

$ echo "A_B_C_D" | awk '{n=split($0,a,"_"); for (i=1;i<=n;i++) {print i,a[i]}}'
1 A
2 B
3 C
4 D

由于

2 个答案:

答案 0 :(得分:2)

man awk并查找in运算符。如果要使用in运算符控制输出顺序,可以通过填充PROCINFO["sorted_in"]来使用GNU awk。有关详细信息,请参阅http://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal

答案 1 :(得分:0)

感谢@fedorqui,答案已经被问到here

这是满足我好奇心的最佳答案:

  

来自8. Arrays in awk --> 8.5 Scanning All Elements of an Array   引用for(数组中的值)时的GNU Awk用户指南(gawk 3.1.0)   语法:

     

此语句访问数组元素的顺序   由阵列的内部排列决定   awk中的元素,无法控制或更改。这可能导致   如果新元素被添加到数组中的语句中的问题   循环体;不能预测for循环是否会   到达他们。类似地,改变循环内部的var可能会产生   奇怪的结果。最好避免这样的事情。

当循环遍历dict.keys()时,它就像python字典,不是吗?