gpt4 book ai didi

awk - awk 中 NF 的后递减

转载 作者:行者123 更新时间:2023-12-03 20:23:26 27 4
gpt4 key购买 nike

我对以下内容有些困惑:

$ echo foo bar baz | awk '{printf "%d:", NF--; print NF}'
3:2
$ echo foo bar baz | awk '{printf "%d:", NF; $NF=""; NF -= 1; print NF}'
3:2
$ echo foo bar baz | awk '{printf "%d:", NF; $(NF--)=""; print NF}'
3:3
我在 awk version 20070501 中看到了相同的行为(macos) 和 GNU Awk 4.0.2 .为什么第 3 种情况下 NF 的后递减不适用?这种行为是预期的,是标准规定的,还是实现的一个怪癖?

Ed Morton 编辑:FWIW 我会发现以下一个更引人注目的例子:
$ echo foo bar baz | awk '{printf "%d:", NF; NF--; $NF=""; print NF}'
3:2

$ echo foo bar baz | awk '{printf "%d:", NF; --NF; $NF=""; print NF}'
3:2

$ echo foo bar baz | awk '{printf "%d:", NF; $NF=""; NF--; print NF}'
3:2

$ echo foo bar baz | awk '{printf "%d:", NF; $NF=""; --NF; print NF}'
3:2

$ echo foo bar baz | awk '{printf "%d:", NF; $(--NF)=""; print NF}'
3:2

$ echo foo bar baz | awk '{printf "%d:", NF; $(NF--)=""; print NF}'
3:3
问题是为什么最后一个示例(带有赋值的后递减)的行为与所有其他情况不同,无论您认为它应该与哪个相同。

最佳答案

递减后的值是变量递减前的值。因此,最后一种情况是在递减后添加一个新字段 NF , 更新 NF .

$(NF--) = "";
相当于
temp = NF;  # temp == 3
NF--; # NF == 2
$temp = ""; # adds a new field 3, so now NF == 3

关于awk - awk 中 NF 的后递减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66159761/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com