awkには、パイプで接続されているファイルのすべての列を合計する次のスクリプトがあります。
#sum_all.awk
{ for (i=1; i<=NF; i++) { sum[i]+= $i } }
END { for (i=1; i<=NF; i++ ) { printf "%d ", sum[i] } }
たとえば、cat my_file.txt | awk -f sum_all.awk
そしてmy_file.txt
:
5 7 8
1 0 2
出力:
6 7 10 %
最後の文字をどのように削除できますか%
?
答え1
END { for (i=1; i<=NF; i++ ) { printf "%d ", sum[i] } ; print "" }
答え2
〜のようにmanatworkさんがコメントを作成しました。は%
awk出力の一部ではなく、シェルの次のプロンプトです。このEND
ブロックには、この入力ファイルの3つのペアがありますprintf
。最初の出力6
とスペース、2番目の出力7
とスペース、3番目の出力10
とスペース。次に awk が終了し、シェルがプロンプトを出力します。
コマンドが改行で終わらないいくつかの出力を印刷する場合(またはより一般的に行の先頭にカーソルを置かない場合)、シェル構成によっては、シェルは次の行になります。それ以外の場合は、シェルが終了していない行が削除され、対応するプロンプトが行の先頭に印刷されます。
コマンドの出力が完全に表示されるようにするには、コマンドが出力を生成しない限り、新しい行で終わることを確認してください。 Unixシステムでは、空でないテキストファイルは常に改行文字で終わり、その理由はテキストファイルが一連の(おそらく空の)行で構成されており、各行は改行文字(およびnull)ではなく一連の(おそらく空です)ある)行で構成されているからです。 。文字はバイトを形成します)。ほとんどのユーティリティは主にテキストファイルを処理するように設計されている傾向があるため、コマンド出力が有効なテキストファイルであることを確認してください。
フィールドを印刷した後にa "\n"
(awkの改行文字表現)を印刷するか、print
テキストを印刷した後に改行文字を追加するこの関数を呼び出します。
END { for (i=1; i<=NF; i++) printf "%d ", sum[i]; print ""; }
または、行の末尾に余分なスペースを避けるには、次の手順を実行します。
END { for (i=1; i<NF; i++) printf "%d ", sum[i]; printf "%d\n", sum[NF]; }
または
END { printf "%d"; for (i=2; i<=NF; i++) printf " %d", sum[i]; print ""; }
または
END { for (i=1; i<NF; i++ ) printf "%d%s", sum[i], (i==NR ? "\n" : " "); }