30

有没有办法打印由 OFS 分隔的所有记录,而无需输入每个列号。

#Desired style of syntax, undesired result
[kbrandt@glade: ~] echo "1 2 3 4" | gawk 'BEGIN { OFS=" :-( "}; {print $0}'        
1 2 3 4

#Desired result, undesired syntax
[kbrandt@glade: ~] echo "1 2 3 4" | gawk 'BEGIN { OFS=" :-) "}; {print $1,$2,$3,$4}'
1 :-) 2 :-) 3 :-) 4
4

2 回答 2

42

这是第一种样式的变体:

echo "1 2 3 4" | gawk 'BEGIN { OFS=" :-( "}; {$1=$1; print $0}'

结果:

1 :-( 2 :-( 3 :-( 4

解释:

$1=$1是重建记录,使用当前的OFS(你也可以看到http://www.gnu.org/software/gawk/manual/gawk.html#Changing-Fields

更新:

(@EdMorton 和 @steve 建议)这是 awk 命令的一个更简短的等效版本,它在命令行中设置 OFS,并print $0作为默认操作利用:

awk -v OFS=" :-( " '{$1=$1}1'
于 2012-12-04T14:54:28.157 回答
2

Sed 等价物:

$ echo "1 2 3 4" | sed 's/ /:-)/g'

这是 awk 的另一个选项:

$ echo "1 2 3 4" | awk '{ gsub(/\s/, ":-)")}1' 
于 2014-09-21T22:10:11.603 回答