此命令有效。它输出字段分隔符(在本例中为逗号):
$ echo "hi,ho"|awk -F, '/hi/{print $0}'
hi,ho
此命令有奇怪的输出(缺少逗号):
$ echo "hi,ho"|awk -F, '/hi/{$2="low";print $0}'
hi low
将OFS
(输出字段分隔符)变量设置为逗号可修复此情况,但实际上并未解释此行为。
我可以告诉awk
保留OFS吗?
答案 0 :(得分:10)
当您修改该行($0
)awk
时,重新构建所有列并将OFS
的值放在它们之间,默认情况下为空格。您修改了$2
的值,这意味着您强制awk
重新评估$0
。
在第一种情况下使用$0
按原样打印行时,由于未修改任何字段,awk
未重新评估每个字段,因此会保留字段分隔符。
为了保留字段分隔符,您可以使用:
指定 BEGIN
阻止:
$ echo "hi,ho" | awk 'BEGIN{FS=OFS=","}/hi/{$2="low";print $0}'
hi,low
使用-v
选项:
$ echo "hi,ho" | awk -F, -v OFS="," '/hi/{$2="low";print $0}'
hi,low
在awk
结束时定义:
$ echo "hi,ho" | awk -F, '/hi/{$2="low";print $0}' OFS=","
hi,low
答案 1 :(得分:1)
您的第一个示例不会更改任何内容,因此所有内容都将作为输入打印出来
在第二个示例中,它更改了行,它将使用默认的OFS,即(一个空格)
所以要克服这个:
echo "hi,ho"|awk -F, '/hi/{$2="low";print $0}' OFS=","
hi,low
答案 2 :(得分:0)
在您的BEGIN操作中,设置OFS = FS。