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,因为对具体情况的回答已经解决了!
在awk
, print
后print
自动插入一个ORS
。 ORS
代表“输出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
ORS
, printf
不会。 因此, 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