awk不打印换行符


169

我希望变量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

Answers:


219

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

print将默认插入一个换行符。您不希望发生这种情况,因此请printf改用。


4
但是printf解释的想法是%s这样printf "%s" whatever代替printf whatever
Matthieu

1
printf "%s",whatever您忘记了逗号。您还可以扩展更多变量,并用逗号分隔它们。
Hielke Walinga '18年

74

AWK中的ORS(输出记录分隔符)变量默认为“ \ n”,并在每行之后打印。BEGIN如果要连续打印所有内容,可以在本部分中将其更改为“” 。


6
您甚至可能希望将其设置""为无分隔符(没有空格)。
mschilli 2013年

8
像这样:awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
Fredrik Erlandsson

2
或者ORS="\r",例如,如果要打印显示进度的计数器。
Skippy le Grand Gourou 2014年

47

我想很多人都在问这个问题,以寻求避免在中使用新行的方法awk。因此,我将提供一种解决方案,因为针对特定上下文的答案已经解决了!

在中awk,打印后print自动插入一个ORSORS代表“输出记录分隔符”,默认为新行。因此,每当您说print "hi"awk 时都会显示“ hi” +新行。

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

用空 ORS

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

这一起返回“ helloman”。

这里的问题是,并非所有的awk都接受设置为empty ORS,因此您可能必须设置另一个记录分隔符。

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

例如:

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

返回“ hello-man-”。

使用printf(首选)

虽然print武官ORS纪录后,printf没有。因此,printf "hello"仅打印“ 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

5

单程

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

1
未成年人注意:千万不要用printf $0,因为$0可能包含像串%F等..易继失败(至少GAWK 3.1.5) echo "%F"|awk '{printf $0}'。使用printf "%s",$0代替。
弗拉德(Vlad)


1

如果可以选择Perl,则可以使用fedorqui的示例解决方案:

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

说明:
chomp删除换行符以
print "$_ "打印每行,并在
END{}块后添加空格以用于打印换行符

输出: 1 2 3 4 5

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.