2012-12-04 33 views
17

分离有没有一种方法来打印由OFS分隔的所有记录,而不打字每列数。打印所有的字段AWK通过OFS

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

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

回答

26

这是第一个样式的变化:

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' 
+5

完美的,但它应该是幸福的笑脸,因为它的工作原理;-) –

+0

这是一个很好反对:)问候 –

+0

@steve注:有取代了块'{$ 1美元一个编辑= $ 1;打印$ 0}'只需要$ 1 = $ 1'。这会导致$ 1 == 0失败。 –

2

桑达相当于:

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

下面是使用awk另一种选择:

$ echo "1 2 3 4" | awk '{ gsub(/\s/, ":-)")}1' 
+0

欢迎来到SO!问题是关于awk的具体问题,所以使用sed的答案在这里不合适 – cfi

+0

如果你注意到,我认为你应该阅读'sed's// :-)/g'',OP在笑脸周围有一个空格OFS – v010dya