awk - 打印 $0 忽略 OFS

awk - 打印 $0 忽略 OFS

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

这是我尝试过的命令:

cat /etc/passwd | awk -F':' '{print $0}'

给定此示例输入:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

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

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

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

root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologin

感谢您的帮助 :)

答案1

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

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

</etc/passwd  awk -F: '{$1=$1;print}'

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

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

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

$1 = $1   # force record to be reconstituted
print $0  # or whatever else with $0

这迫使awk重建记录。正如我们在此处所示,添加评论确实有帮助。

答案2

$0 字段只是一行,没有进行解析。您需要使用 NF 变量(字段数量,由 FS 确定)循环每个字段:

cat /etc/passwd | awk -F':' '{for (i=1;i<=NF;i++) {printf "%s ",$i}; printf "\n"};'

相关内容