【问题标题】:Are fields defined in the END block in AWK?字段是否在 AWK 的 END 块中定义?
【发布时间】:2025-12-05 15:50:02
【问题描述】:

END 块中使用$1$2 ... 会发生什么情况,例如:

awk '{print $3}END{print $1 $2}'

我发现$1$2 保留了最后一条记录中的值。这种行为是由标准保证的还是特定于实现的?

【问题讨论】:

  • 我认为它是特定于实现的。我在spec 中没有看到任何直接声明字段变量END 块中清除的内容。
  • 我找不到专门针对这些字段的引用,但许多其他变量,例如 NR,被指定为处理最后一条记录的值,因此不会疯狂地将其扩展到字段变量。
  • 它是特定于实现的。例如,在 HP-UX 中,$0 为空。 awk's END block behaviour on HP-UX

标签: bash variables awk gawk


【解决方案1】:

检查docs,我们发现它是特定于实现的

传统上,主要由于实施问题,$0 和 NF 是 在 END 规则中未定义。 POSIX 标准规定 NF 是 在 END 规则中可用。它包含来自 最后输入记录。很可能是由于疏忽,标准 并没有说 $0 也被保留,尽管逻辑上是 认为它应该是。事实上,BWK 的所有 awk、mawk 和 gawk 保留 $0 的值以在 END 规则中使用。 但请注意, 其他一些实现和许多旧版本的 Unix awk 没有

【讨论】:

  • 正确。正如@fedorqui 在他的评论HP-UX awk 中指出的那样,例如,不会在END 部分保留$0 等。我希望有人使用 HP-UX 测试的 OPs 脚本的解决方法是awk '{print $3; last=$0} END{$0=last; print $1, $2}'
  • @EdMorton 检查一下会很有趣,因为我很想知道$0 是否也内置在END 中。在我的 GNU awk 中它确实是 awk 'END {$0="a b c"; print $1}' file,但我不知道这是否出现在所有 awk 风格中。
  • 应该工作,因为 POSIX 说的是 assignment to $0 does blah blah blah,而不是 assignment to $0 does blah blah blah except when done in the END section,但我想从一个不保留的 awk 的测试中得到确认$0 进入 END 部分。
最近更新 更多