ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 awk 打印最后两列

awk

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

不太清楚为什么它有 87 个赞成票,至少可以通过一个例子来改进它。
可能是因为这个问题本质上非常简单,并且没有示例就很容易理解,这很少见,但在这种情况下它似乎有效。我认为这里的问题不在于缺乏信息,而更多的是它表明缺乏独立研究。
此问题也是 this 问题的副本。
这回答了你的问题了吗? Print second last column/field in awk

c
codaddict

您可以使用设置为输入记录中字段总数的变量 NF

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

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


你需要一个逗号——因为我们今天很挑剔:空格连接字段,逗号分隔打印语句中的字段。这将合并两个字段
现在您正在打印“field-OFS-tab-OFS-field”。它应该是 awk '{print $(NF-1) "\t" $NF}' fileawk '{print $(NF-1), $NF}' fileawk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
只是添加到前面的评论中,使用 '{print $x,"\t",$y}' 的问题是 awk 将每个逗号分隔的变量解释为它自己的字段,所以结果实际上是 field1<space><tab><space>field2,(因为它默认使用空格分隔符)作为与 field1<tab>field2 相反,这可能是您所期望的。使用输出字段分隔符 (OFS) 几乎总是您想要的。
j
jim mcnamara
awk '{print $NF-1, $NF}'  inputfile

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


试试看。它确实适用于 Solaris 9 awk 和 nawk。另一种选择是 $(NF-1)
@coaddict - 我猜你没有使用不同的 awk 实现。旧的 awks 行为已经(可能是错误地)被提出来。我没有 gawk 来测试——这可能是你所引用的。所以我不确定你的评论为什么会被放弃。开箱即用的 Linux awk 通常是 gawk。我会测试并回帖。同时尝试 Soalris 或 HPUX 或 DGX 或其他任何东西,看看我所说的旧 awk 是什么意思。
您可能因为尝试了 echo 1 2 3 | awk ... 而误以为它有效。 $NF-1 在每个 awk 实现中都是 ($NF) - 1
“一个真正的 awk”源代码在 yacc 语法中有 40 多个冲突,考虑到 A 在 awk 中代表什么,这具有讽刺意味。不同版本的 awk 解析事物的方式不同?大惊喜!
@THESorcerer,尝试使用 echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}' - 或第二个最后一个字段不小于最后一个字段的任何其他输入。
Z
Zombo

@jim mcnamara:尝试在 NF 附近使用括号,即 $(NF-1)$(NF) 而不是 $NF-1$NF(适用于 Mac OS X 10.6.8 for FreeBSD awkgawk)。

echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'

# output:
# 1 2
# 2 3
# two three

我们之前已经考虑过 ()。我以为我们正在讨论原始的旧 awk 行为来自何处。
+1 对于明确的 $(NF-1) 的答案 - 至少比 $NF-1 更便携;它肯定不那么模棱两可。不过,$(NF) 是多余的 - 只需 $NF 就可以了。防范少于 2 列的行也是值得的,因为对于单列行,您将获得第一列值 两次,而对于零列(即空行),awk 命令将由于尝试访问索引为 -1 的字段而完全失败。
我认为我们可以缩短一点:gawk 'NF>=2 {print $(NF-1), $NF}'
m
mklement0

使用 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 表示字段编号或减法。唔。


示例输入文件的前 2 行没有帮助,因为它们会产生与任何一种行为相同的输出。您能否再次确认 Solaris awk 在这种情况下确实不像 gawk 那样表现?
至于您到 awk 规范的链接:使用 $(NF-1) 的轶事参数是规范中计算字段索引的两个示例都使用该形式:$(NF-1)$(NF+2)。然后是“awk 中的表达式”部分,其中将 $expr 列为比 expr - expr 具有 [远] 高的优先级。由于 NF 本身就是一个表达式,因此 $NF-1 的计算结果应为 ($NF)-1。毕竟,即使确实存在将 $NF-1 评估为 $(NF-1) 的 awk 实现,这里学到的教训是使用 $(NF-1) 是安全且可移植的选择。
D
DryLabRebel

请尝试这样做以考虑所有可能的情况:

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

或者

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

或者

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

N
Namasivayam Chinnapillai

试试这个

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