awk没有打印换行符

我希望可变和/ NR在每次迭代中并排打印。 我们如何避免awk在每次迭代中打印换行符? 在我的代码中,默认情况下在每次迭代中都会打印一个换行符

for file in cg_c ep_c is_c tau xhpl printf "\n $file" >> to-plot.xls for f in 2.54 1.60 800 awk '{sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls done done 

我希望输出像这样出现

 cg_c ans1 ans2 ans3 ep_c ans1 ans2 ans3 is_c ans1 ans2 ans3 tau ans1 ans2 ans3 xhpl ans1 ans2 ans3 

我目前的输出是这样的

 **cg_c** ans1 ans2 ans3 **ep_c** ans1 ans2 ans3 **is_c** ans1 ans2 ans3 **tau** ans1 ans2 ans3 **xhpl** ans1 ans2 ans3 

awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls

print将默认插入一个换行符。 你不希望发生这种情况,所以使用printf来代替。

AWK中的ORS(输出logging分隔符)variables默认为“\ n”,并在每行后面打印。 如果您希望连续打印所有内容,则可以在“开始”部分将其更改为“”。

我想很多人都在进入这个问题寻找一种方法来避免awk的新行。 因此,我将为此提供解决scheme,因为对具体情况的回答已经解决了!

awkprintprint自动插入一个ORSORS代表“输出logging分隔符”,默认为新行。 所以,只要你print "hi" awk打印“嗨”+新行。

这可以通过两种不同的方式进行更改:使用空ORS或使用printf

使用一个空的ORS

 awk -v ORS= '1' <<< "hello man" 

这返回“helloman”,一起。

这里的问题是,并不是所有的awks都接受设置一个空的ORS ,所以你可能不得不设置另一个logging分隔符。

 awk -v ORS="-" '{print ...}' file 

例如:

 awk -v ORS="-" '1' <<< "hello man" 

返回“hello-man-”。

使用printf (最好)

logging后print ORSprintf不会。 因此, printf "hello"只是打印“你好”,没有别的。

 $ awk 'BEGIN{print "hello"; print "bye"}' hello bye $ awk 'BEGIN{printf "hello"; printf "bye"}' hellobye 

最后,请注意一般情况下,这会丢失最后一行,因此shell提示符将与输出的最后一行位于同一行。 要清除这个问题,使用END {print ""}这样所有的处理之后都会打印一个新行。

 $ seq 5 | awk '{printf "%s", $0}' 12345$ # ^ prompt here $ seq 5 | awk '{printf "%s", $0} END {print ""}' 12345 

单程

 awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls 

如果Perl是一个选项,这是一个使用fedorqui的例子的解决scheme:

seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'

说明:
chomp删除换行符
print "$_ "打印每一行,附加一个空格
END{}块用于打印换行符

输出: 1 2 3 4 5