我想要的只是打印的最后两列。
您可以使用设置为输入记录中字段总数的变量 NF
:
awk '{print $(NF-1),"\t",$NF}' file
这假设您至少有 2 个字段。
awk '{print $NF-1, $NF}' inputfile
注意:这仅在至少存在两列时才有效。在只有一列的记录上,您会得到一个虚假的 "-1 column1"
echo 1 2 3 | awk ...
而误以为它有效。 $NF-1
在每个 awk
实现中都是 ($NF) - 1
。
yacc
语法中有 40 多个冲突,考虑到 A 在 awk 中代表什么,这具有讽刺意味。不同版本的 awk 解析事物的方式不同?大惊喜!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- 或第二个最后一个字段不小于最后一个字段的任何其他输入。
@jim mcnamara:尝试在 NF
附近使用括号,即 $(NF-1)
和 $(NF)
而不是 $NF-1
和 $NF
(适用于 Mac OS X 10.6.8 for 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)
是多余的 - 只需 $NF
就可以了。防范少于 2 列的行也是值得的,因为对于单列行,您将获得第一列值 两次,而对于零列(即空行),awk 命令将由于尝试访问索引为 -1 的字段而完全失败。
gawk 'NF>=2 {print $(NF-1), $NF}'
使用 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
我只是把 gawk 放在 Solaris 10 M4000 上:所以,gawk 是 $NF-1 与 $(NF-1) 问题上的焦点。下一个问题 POSIX 说什么?每:
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)
是安全且可移植的选择。
请尝试这样做以考虑所有可能的情况:
awk '{print $(NF-1)"\t"$NF}' file
或者
awk 'BEGIN{OFS="\t"}' file
或者
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file
试试这个
$ 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 '{print $(NF-1), $NF}' file
或awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
。'{print $x,"\t",$y}'
的问题是 awk 将每个逗号分隔的变量解释为它自己的字段,所以结果实际上是field1<space><tab><space>field2
,(因为它默认使用空格分隔符)作为与field1<tab>field2
相反,这可能是您所期望的。使用输出字段分隔符 (OFS) 几乎总是您想要的。