AWK - 打印输入文件每行的倒数第二个字段

5

我有一个输入文件,其内容不断更新,包含各种数量的字段。我想要做的是将每行输入文件的倒数第二个字段打印到一个新文件中:

awk '{print $(NF-1)}' outputfile > newfile

错误信息: awk: (FILENAME=- FNR=2) fatal: attempt to access field -1

需要帮助。提前致谢。

3个回答

10

对于没有字段的行(空行或全部是空格的行),NF 为0,因此计算结果为 $(-1)。如果只有一个字段,则您的代码将打印 $0,这可能不是您想要的。

awk 'NF>=2 {print $(NF-1)}'

3

应该是awk 'NF > 1 { print $(NF - 1); }'

awk 'NF { print $(NF - 1) }'是不正确的。当NF==1时,它会打印$0,而不是倒数第二个字段


+1 对于这个解决方案,但是不要使用空语句(尾部分号)。 - Ed Morton
@EdMorton:您所说的“但是失去了空语句(尾部分号)”是什么意思? - pynexj
2
语句 print $(NF - 1) 后面的分号引入了一个空/无效的后续语句。只需去掉分号即可解决问题,即使用 { print $(NF - 1) } 而不是 { print $(NF - 1); } - Ed Morton
那是我的风格。我想让它看起来更像一个陈述。 :) - pynexj
嗯,我想你可以做比在代码中添加虚假分号更糟糕的事情,而且我不认为这会导致任何功能性故障。但说实话,我不确定我理解其中的吸引力,当我在脚本中看到它时,总是需要花费更长的时间来阅读代码,以确信它真的没有做任何非显而易见的事情,所以我对此感到恼火,但这可能只是我的个人问题... - Ed Morton
3
为了阐明为什么当我看到毫无意义的分号时会浪费我的时间并感到沮丧,有两个语句将产生很大的差异:x > y { print }x > y; { print; }。对于{x = a b}{x = a; b;}同样适用。因此,当你故意添加没有任何作用的分号时,我最初的想法是找出它们的作用,因为分号的位置通常对程序有很大的影响,然后当我确信它们没有起到任何作用,而只是一种“风格选择”时,就会感到恼怒...... - Ed Morton

-1
另一条awk命令行(稍微压缩了一下):
awk 'NF>1&&$0=$(NF-1)' 

它能工作吗?echo foo | awk 'NF && $0 = $(NF-1)' 输出 foo - pynexj

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