我想输出每个列/字段,但是当我使用变量执行此操作时,它会忽略作为单个的$0
默认变量,因此仍然会打印。OFS
space
:
这是我尝试过的命令:
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"};'