俺の file.txt
は次のようになります。
1 12
2 18
3 45
4 5
5 71
6 96
7 13
8 12
次のように2番目の列を合計できます。
awk '{ sum += $2 } END { print sum }' file.txt
272
各行にその合計を印刷できる最も近い方法は何ですか?これは私が期待していることです:
1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272
標準のawk
ウェイの種類。
$ awk 'FNR==NR{sum+=$2;next}; {print $0,sum}' file.txt{,}
1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272
次を使用できます。
awk -v xyzzy=$(awk '{sum+=$2}END{print sum}' file.txt)
'{print $0" "xyzzy}' file.txt
残念ながら、これは情報を調べることを意味します2回ですが、合計を取得する前に一度行う必要があるため、実際の方法はありません。 Any解決策は、何かを出力する前に情報を保存することを伴います(配列であるか、ファイルに戻るか)。
内側のawk
は合計を計算し、外側のawk
はそれを変数に割り当て、各行とともに印刷できます。
それをファイルに適用する:
a 1
b 2
c 3
d 4
e 5
1 + 2 + 3 + 4 + 5
は15
と等しいため、
a 1 15
b 2 15
c 3 15
d 4 15
e 5 15
配列を使用する
{
a[NR] = $0
sum += $2
}
END {
for (x = 1; x <= NR; x++) {
print a[x], sum
}
}
出力
$ awk -f s.awk file.txt
1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272
詳しくは Gnu Awk Manual をご覧ください
い解決策:
awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047 file ")}' file
awk、はい、頭とペースト。
$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -
オフトピックですが、Perlでは次のことができます。
Perl -nale '$s+=$F[1];Push(@a,$_);END{print $_." $s" for(@a);}' file.txt