web-dev-qa-db-ja.com

awkは列を合計し、入力の各行にその合計を出力します

俺の 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
23
Steve

標準の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
19
kev

次を使用できます。

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 + 515と等しいため、

a 1 15
b 2 15
c 3 15
d 4 15
e 5 15
7
paxdiablo

配列を使用する

{ 
    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 をご覧ください

3
Fredrik Pihl

い解決策:

awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047  file ")}' file
1
Tedee12345

awk、はい、頭とペースト。

$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -
1
Taku Miyakawa

オフトピックですが、Perlでは次のことができます。

Perl -nale '$s+=$F[1];Push(@a,$_);END{print $_." $s" for(@a);}' file.txt
1
codaddict