Sha*_*dra 155 scripting awk newline
我希望在每次迭代中并排打印变量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
Run Code Online (Sandbox Code Playgroud)
我希望输出看起来像这样
cg_c ans1 ans2 ans3
ep_c ans1 ans2 ans3
is_c ans1 ans2 ans3
tau ans1 ans2 ans3
xhpl ans1 ans2 ans3
Run Code Online (Sandbox Code Playgroud)
我目前的出局是这样的
**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3
Run Code Online (Sandbox Code Playgroud)
Cod*_*ain 202
awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
print将默认插入换行符.你不希望这种情况发生,因此使用printf.
dan*_*ben 71
AWK中的ORS(输出记录分隔符)变量默认为"\n",并在每行后打印.BEGIN如果您想要连续打印所有内容,可以在该部分中将其更改为"" .
fed*_*qui 40
我想很多人都在进入这个问题,寻找避免新线路的方法awk.因此,我将提供一个解决方案,因为特定背景的答案已经解决了!
在awk,print自动插入ORS后打印.ORS代表"输出记录分隔符",默认为新行.所以每当你说print "hi"awk打印"hi"+新行.
这可以通过两种不同的方式进行更改:使用空ORS或使用printf.
ORSawk -v ORS= '1' <<< "hello
man"
Run Code Online (Sandbox Code Playgroud)
这将一起返回"helloman".
这里的问题是并非所有awks都接受设置为空ORS,因此您可能必须设置另一个记录分隔符.
awk -v ORS="-" '{print ...}' file
Run Code Online (Sandbox Code Playgroud)
例如:
awk -v ORS="-" '1' <<< "hello
man"
Run Code Online (Sandbox Code Playgroud)
返回"hello-man-".
printf(优选)虽然print高度ORS纪录后,printf没有.因此,printf "hello"只打印"你好",没有别的.
$ awk 'BEGIN{print "hello"; print "bye"}'
hello
bye
$ awk 'BEGIN{printf "hello"; printf "bye"}'
hellobye
Run Code Online (Sandbox Code Playgroud)
最后,请注意,通常这会错过最后一个新行,因此shell提示符将与输出的最后一行位于同一行.要清除它,请使用,END {print ""}以便在所有处理后打印新行.
$ seq 5 | awk '{printf "%s", $0}'
12345$
# ^ prompt here
$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345
Run Code Online (Sandbox Code Playgroud)
单程
awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
Run Code Online (Sandbox Code Playgroud)