入力ファイル(FileInput.txt):
10 20 3 100 5 3 27
これは私のawkスクリプトです。
BEGIN{ while((getline line < "FileInput.txt") > 0) {
}
合計をどのように計算できますか?試してみましたsum+=line
が、最初の列だけが合計されました。
答え1
次の操作が実行されます。
awk 'BEGIN {sum=0} {for (i = 1; i <= NF; i++) sum+=$i} END {print sum}' FileInput.txt
答え2
コードの問題は2つあります。
awk
実際にはそのように使用されません。これはブロックのファイル行を明示的に繰り返しますBEGIN
。これは人々が通常プログラムを書く慣用的な方法ではありませんawk
。つまり、各入力レコード(行)に対して実行されるブロックの(オプションの)パターンまたは条件を提供します。- 入力は複数の数字(デフォルトでは単一行)を持つレコードで構成されるため、個々の数字を一緒に追加する方法でレコードを処理する必要があります。つまり、に加えることはできませんが、
20 3
最初に合計sum
で除算する必要があります。20
3
GNUawk
またはを使用すると、デフォルトの改行ではなく空白文字シーケンスに一致する正規表現であるレコード区切りmawk
文字を設定できます。RS
これにより、awk
ファイルはスペースで区切られた単一フィールドレコードのコレクションとして読み取られます。これを合計して最後に合計を印刷するのは簡単です。
$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168
または、
$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168
または、いくつかの変形を行うことができます。ロミオ・ニノフが見せたものつまり、各行のフィールドを繰り返しながら
$ awk '{ for (i = 1; i <= NF; ++i) sum += $i } END { print sum }' file
168
答え3
1行に1つの数字しかないようにファイルを変換できます。
tr -s '[:blank:]' '\n' < FileInput.txt
次に、次のソリューションを選択します。https://stackoverflow.com/q/2702564/7552まとめてください。例えば
tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'