我只想要最后两列被打印出来。
我只想要最后两列被打印出来。
NF
,该变量设置为输入记录中字段的总数:awk '{print $(NF-1),"\t",$NF}' file
前提是您至少有2个字段。
awk '{print $(NF-1) "\t" $NF}' file
或者 awk '{print $(NF-1), $NF}' file
或者 awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
。 - Dennis Williamson'{print $x,"\t",$y}'
的问题在于 awk 会将每个逗号分隔的变量解释为它自己的字段,所以结果实际上会是 field1<space><tab><space>field2
(因为默认情况下它会使用空格作为分隔符),而不是你期望的 field1<tab>field2
。使用输出字段分隔符(OFS)几乎总是你想要的。 - DryLabRebelawk '{print $NF-1, $NF}' inputfile
注意:只有存在至少两列时,该方法才有效。对于只有一列的记录,你将会得到一个虚假的"-1 column1"
。
echo 1 2 3 | awk ...
。在每个awk
实现中,$NF-1
都等价于($NF) - 1
。 - Stephane Chazelas-1
,这表明@StephaneChazelas是正确的。如果你所说的关于“旧”awk行为的主张是正确的,那么第一个标记应该有效地是$0
,即整个输入行。由于在这种情况下整个输入行只有一个标记 - 第一列也是唯一的列 - 你应该会得到那个一列值两次。 - mklement0echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
进行测试 - 或者任何其他输入,其中倒数第二个字段不是比最后一个字段小1。 - glenn jackman@jim mcnamara:尝试使用括号将NF
括起来,即$(NF-1)
和$(NF)
代替$NF-1
和$NF
(适用于Mac OS X 10.6.8上的FreeBSD awk
和gawk
)。
echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'
# output:
# 1 2
# 2 3
# two three
$(NF-1)
的答案——至少比 $NF-1
更具可移植性,而且绝对不会产生歧义。虽然 $(NF)
也可以使用,但是这样有些多余。值得注意的是,防止少于2列的行也很重要,因为一列的行会使第一列的值重复出现两次,并且零列(即空行)会导致awk命令完全失败,因为试图访问索引-1的字段。 - mklement0gawk 'NF>=2 {print $(NF-1), $NF}'
。 - SergioAraujo使用 gawk 出现了问题:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
这里没有明确的方向。不太好。gawk 暗示减法,其他 awk 暗示字段编号或减法。嗯。
$(NF-1)
的轶事论据是规范中计算字段索引的两个示例都使用了该形式:$(NF-1)
和 $(NF+2)
。然后有一个“awk表达式”部分,其中将 $expr
列为比 expr - expr
具有更高的[多]优先级。由于 NF
本身就是一个表达式,因此 $NF-1
应该被计算为 ($NF)-1
。即使在所有情况下,确实存在将 $NF-1
计算为 $(NF-1)
的 awk 实现,这里学到的教训是使用 $(NF-1)
是安全和可移植的选择。 - mklement0试试这个
$ cat /tmp/topfs.txt
/dev/sda2 xfs 32G 10G 22G 32% /
awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'
awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%
awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /
awk '{print $(NF-1)"\t"$NF}' file
或者
awk 'BEGIN{OFS="\t"}' file
或者
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file