我希望在每次迭代中并排打印变量sum / 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
答案 0 :(得分:191)
awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
print
默认会插入换行符。你不希望这种情况发生,因此请改用printf
。
答案 1 :(得分:70)
AWK中的ORS(输出记录分隔符)变量默认为“\ n”,并在每行后打印。如果您想要连续打印所有内容,可以在BEGIN
部分将其更改为“”。
答案 2 :(得分:35)
我想很多人都在这个问题中寻找避免awk
中新行的方法。因此,我将提供一个解决方案,因为特定背景的答案已经解决了!
在awk
中,print
会在打印后自动插入ORS
。 ORS
代表“输出记录分隔符”,默认为新行。所以每当你说print "hi"
awk打印“hi”+ new line。
可以通过两种不同的方式进行更改:使用空ORS
或使用printf
。
ORS
awk -v ORS= '1' <<< "hello
man"
这将一起返回“helloman”。
这里的问题是并非所有的awks都接受设置空的ORS
,所以你可能需要设置另一个记录分隔符。
awk -v ORS="-" '{print ...}' file
例如:
awk -v ORS="-" '1' <<< "hello
man"
返回“hello-man - ”。
printf
(首选)虽然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
答案 3 :(得分:5)
单程
awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
答案 4 :(得分:1)
如果Perl是一个选项,这里有一个使用fedorqui的例子的解决方案:
seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'
说明:
chomp
删除换行符
print "$_ "
打印每一行,附加一个空格
END{}
块用于打印换行符
输出:1 2 3 4 5
答案 5 :(得分:0)
您可以像这样简单地动态使用ORS:
awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out