【问题标题】:AWK : Why does the for-loop take the second argument first?AWK:为什么 for 循环首先采用第二个参数?
【发布时间】:2014-03-20 18:52:05
【问题描述】:

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

$ 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

其中空是一行文件。

但是,这是可行的:

$ 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

谢谢

【问题讨论】:

  • 我给出的最后一个例子(“This works)给出了一个有序的输出。所以我想回答的问题是,如果我提出的那个对gawk 3.1.0有效, 对 MacOS 中的 awk 无效,那么,为什么会出现这种行为?

标签: for-loop awk split


【解决方案1】:

man awk 并查找 in 运算符。如果您想使用in 运算符控制输出顺序,您可以使用 GNU awk 通过填充PROCINFO["sorted_in"] 来实现。详情请见http://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal

【讨论】:

【解决方案2】:

感谢@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 字典,不是吗?

【讨论】:

  • 不知道 Python 但该引用对于 GNU awk 来说是不正确的,因为它指出访问顺序 cannot be controlled or changed
  • 这是关于 awk 而不是 gawk。
  • 没有awk,所有awk都是变种(有gawk、tawk、mawk、nawk、POSIX awk、/usr/xpg4/bin/awk、BSD awk等有他们自己的特质),在这种情况下,你发布的引用以及我在上面提到的关于 gawk 的引用非常清楚明确:...in the GNU Awk user's guide...
  • idk 但你可以试试awk --version 看看它告诉你什么。我猜是BSD awk。尝试运行awk 'BEGIN { printf "%s\n", NR==3 }',如果出现语法错误,那就是 BSD awk。我强烈建议您获取最新的 gawk,因为它具有迄今为止所有可用 awks 中最有用的功能。
  • @EdMorton Ha!男孩,这是您了解每个 awk 的局限性以通过其失败来识别版本的一些记忆。 :)。你确实是对的,Mac 附带了 awk 的 BSD 版本,其版本信息只是说 awk version 20070501
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2017-04-27
  • 2021-10-16
相关资源
最近更新 更多