没有打印换行符的awk

时间:2010-01-07 16:49:27

标签: 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

我希望输出显示为

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

6 个答案:

答案 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会在打印后自动插入ORSORS代表“输出记录分隔符”,默认为新行。所以每当你说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