在AWK中,字段是否可以在END块中定义?

7
当在 END 块中使用 $1$2 等时会发生什么,例如:
awk '{print $3}END{print $1 $2}'

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

我认为这取决于具体实现。在规范中没有直接说明在END块中字段变量是否会被清除。 - chepner
我找不到关于那些字段的具体参考,但是许多其他变量(例如NR)被指定为具有最后处理记录的值,因此将其扩展到字段变量也并非荒谬。 - Eric Renouf
1
它是特定于实现的。例如,在HP-UX中,$0为空。awk在HP-UX上的END块行为 - fedorqui
1个回答

8

根据文档,我们可以看到这是实现特定的

传统上,由于实现问题,$0和NF在END规则内部未定义。 POSIX标准指定NF在END规则中可用。它包含来自最后一个输入记录的字段数。由于疏忽,该标准并未说明$0也被保留,尽管从逻辑上讲,它应该被保留。事实上,BWK awk、mawk和gawk都保留了$0的值以供在END规则中使用。但要注意,并非所有的其他实现和许多旧版本的Unix awk都不保留


正确。正如@fedorqui在他的评论中指出的那样HP-UX awk,例如,在END部分中不会保留$0等。我期望的是,对于OPs脚本的解决方法,我希望有HP-UX的人来测试,即awk '{print $3; last=$0} END{$0=last; print $1, $2}' - Ed Morton
@EdMorton,这个很有趣,我很想检查一下,因为我很好奇$0是否也会在END中被构建。在我的GNU awk中,它确实会这样做:awk 'END {$0="a b c"; print $1}' file,但我不知道这是否发生在所有awk版本中。 - fedorqui
它应该可以工作,因为 POSIX 说的是诸如“分配给 $0 的操作会做某些事情”,而不是“除非在 END 部分完成,否则分配给 $0 的操作会做某些事情”。但我想通过使用一个 awk 测试来获得确认,该测试不会将 $0 保留到 END 部分。 - Ed Morton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接