如何使用 awk 打印最后两列

问题描述 投票:0回答:7

我想要的只是打印最后两列。

awk
7个回答
231
投票

您可以使用变量

NF
,将其设置为输入记录中的字段总数:

awk '{print $(NF-1),"\t",$NF}' file

这假设您至少有 2 个字段。


18
投票
awk '{print $NF-1, $NF}'  inputfile

注意:这仅在至少存在两列时才有效。在只有一列的记录上,您会得到一个虚假的

"-1  column1"


7
投票

@jim mcnamara:尝试在

NF
周围使用括号,i。 e.
$(NF-1)
$(NF)
代替
$NF-1
$NF
(适用于 FreeBSD 的 Mac OS X 10.6.8
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

1
投票

使用 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

我刚刚在Solaris 10 M4000上放了gawk: 因此,gawk 是 $NF-1 与 $(NF-1) 问题的核心。下一个问题 POSIX 说什么? 每:

http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html

没有一种方向或另一种方向。不好。 gawk 表示减法,其他 awks 表示字段编号或减法。嗯。


1
投票

试试这个

$ 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% /

1
投票

请尝试此操作以考虑所有可能的情况:

awk '{print $(NF-1)"\t"$NF}'  file

awk 'BEGIN{OFS="\t"}' file

awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file

0
投票

使用

NF>=2
NF==1
通过:

$ echo {a..z} | xargs -n5
a b c d e
f g h i j
k l m n o
p q r s t
u v w x y
z

$ echo {a..z} | xargs -n5 |
  awk 'NF == 1 { print $NF };
       NF >= 2 { print $(NF-1),$NF }
      '
d e
i j
n o
s t
x y
z
© www.soinside.com 2019 - 2024. All rights reserved.