各繰り返しで変数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
awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
print
はデフォルトで改行を挿入します。あなたはそれが起こることを望まないので、代わりにprintf
を使用してください。
AWKのORS(出力レコード分離記号)変数はデフォルトで「\ n」に設定され、各行の後に出力されます。すべてを連続して印刷する場合は、BEGIN
セクションで「」に変更できます。
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
一方通行
awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
Perlがオプションの場合、fedorquiの例を使用したソリューションは次のとおりです。
seq 5 | Perl -ne 'chomp; print "$_ "; END{print "\n"}'
説明:chomp
は改行を削除しますprint "$_ "
は各行を印刷し、スペースを追加しますEND{}
ブロックは、改行を出力するために使用されます
出力:1 2 3 4 5
次のようにORSを動的に使用できます。
awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out