改行を印刷せずに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

回答:


220

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 2018

1
printf "%s",whateverカンマを忘れました。より多くの変数で拡張し、それらをコンマで区切ることもできます。
Hielke Walinga、2018

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 2013

2
またはORS="\r"、たとえば進行状況を示すカウンターを印刷したい場合。
Skippy le Grand Gourou 2014年

47

の新しい行を回避する方法を模索しているこの質問に多くの人々が参加していると思いawkます。したがって、特定のコンテキストへの回答はすでに解決されているので、それだけの解決策を提供します。

ではawk、印刷後にprint自動的に挿入さORSれます。ORS「出力レコードセパレータ」を意味し、デフォルトでは新しい行になります。したがって、print "hi"awkが「hi」+新しい行を出力すると言うときはいつでも。

これは、2つの異なる方法で変更することができます:空を使用して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

最後に、一般に、これは最後の新しい行がないため、シェルプロンプトは出力の最終行と同じ行にあることに注意してください。これをクリーニングするには、を使用し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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.