web-dev-qa-db-ja.com

改行を印刷せずにawk

各繰り返しで変数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
151
Sharat Chandra

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

printはデフォルトで改行を挿入します。あなたはそれが起こることを望まないので、代わりにprintfを使用してください。

199
CodeRain

AWKのORS(出力レコード分離記号)変数はデフォルトで「\ n」に設定され、各行の後に出力されます。すべてを連続して印刷する場合は、BEGINセクションで「」に変更できます。

71
danben

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"は「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
38
fedorqui

一方通行

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

Perlがオプションの場合、fedorquiの例を使用したソリューションは次のとおりです。

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

説明:
chompは改行を削除します
print "$_ "は各行を印刷し、スペースを追加します
END{}ブロックは、改行を出力するために使用されます

出力:1 2 3 4 5

1
Chris Koknat

次のようにORSを動的に使用できます。

awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out

0
Andrea Barletta