awk 打印从第 n 个到最后一个的所有列

jia*_*ian 2 awk

https://www.gnu.org/software/gawk/manual/gawk.html 基于第 1.1.2 节 1.1.2 在没有输入文件的情况下运行 awk 我可以理解 awk '{print $0}' marks.txt 它就像 echo 一样。它会返回

1)  Amit    Physics  80
2)  Rahul   Maths    90
3)  Shyam   Biology  87
4)  Kedar   English  85
5)  Hari    History  89
Run Code Online (Sandbox Code Playgroud)

/sf/ask/207314481/?answertab=votes#tab-top

以下代码也按预期工作。

awk '{print $0}' marks.txt  | awk '{print $2 "\t" $3 "\t"$4}'
Run Code Online (Sandbox Code Playgroud)

我不明白 awk '{$1=""; print $0}' marks.txt即使现在直觉上是有道理的。

Ste*_*itt 5

$1=""; print $0清除第一个字段并在打印之前重新计算整行。这记录在GAWK 手册的更改字段部分中:

\n
\n

当字段的值更改时(如 所感知的awk),输入记录的文本将重新计算以包含旧字段所在的新字段。换句话说,$0进行更改以反映已更改的字段。

\n
\n

这在 AWK 的所有实现中都是如此,它\xe2\x80\x99s 不是 GNU 扩展;AWK 编程语言对此行为的描述如下:

\n
\n

这很重要:什么时候$0被赋值或替换、 、 等改变$1$2并且NF将被重新计算;同样,当$1$2等之一发生更改时,将使用分隔字段$0进行重建。OFS

\n
\n

  • 希望他们在文档中说“重建”而不是“重新计算”。“重新计算”听起来好像发生的事情只是一个数学运算,而 $0 实际上是根据它的字段加上 OFS 字符串重建的。 (2认同)