awk - 打印 $0 忽略 OFS

Bog*_*Bog 3 awk

我想输出每个列/字段,但是当我使用变量执行此操作时,它会忽略作为单个的$0默认变量,因此仍然会打印。OFSspace:

这是我尝试过的命令:

cat /etc/passwd | awk -F':' '{print $0}'
Run Code Online (Sandbox Code Playgroud)

给定此示例输入:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Run Code Online (Sandbox Code Playgroud)

我从命令中得到以下输出:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Run Code Online (Sandbox Code Playgroud)

但我希望我的输出看起来像这样:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助 :)

Tob*_*ght 13

$0表示整行,包括输入字段分隔符。

\n

您只需设置一个字段,就可以使用输出字段分隔符对其进行拆分和重新连接:

\n
</etc/passwd  awk -F: \'{$1=$1;print}\'\n
Run Code Online (Sandbox Code Playgroud)\n

(我改为直接从文件中读取,而不是折磨cat;-)

\n

这记录在GNU 实现手册的更改字段内容awk部分(又名gawk):

\n
\n

最后,有时awk使用字段 和 的当前值强制重建整个记录是很方便的OFS。为此,请使用看似无害的赋值:

\n
</etc/passwd  awk -F: \'{$1=$1;print}\'\n
Run Code Online (Sandbox Code Playgroud)\n

这迫使awk重建记录。它确实有助于添加注释,\nas 我们\xe2\x80\x99 已在此处显示。

\n
\n

  • 由于 `awk` 的字段分割相当幼稚(当使用单个字符作为字段分隔符时),并且由于默认输出分隔符是单个空格,因此通过 `tr : ' ' &lt;file` 或`sed 'y/:/ /' 文件`。 (3认同)
  • 您甚至不必重定向输入文件,顺便说一句 - awk 知道如何自行读取文件: `awk -F: '{$1=$1;print}' /etc/passwd` (2认同)
  • 有趣的是,“NF = NF”也用新的“OFS”重建记录。 (2认同)