24

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
4

6 に答える 6

20

一種の標準的な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
于 2012-05-09T07:04:36.047 に答える
7

以下を使用できます。

awk -v xyzzy=$(awk '{sum+=$2}END{print sum}' file.txt)
    '{print $0" "xyzzy}' file.txt

残念ながら、これは情報を2 回確認することを意味しますが、合計を取得する前に 1 回実行する必要があるため、これを回避する方法はありません。解決策には、何かを出力する前に情報を保存することが含まれます (配列であるか、ファイルに戻るか)。

内側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
于 2012-05-09T06:44:39.977 に答える
3

配列を使用する

{ 
    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 マニュアルで詳細を読む

于 2012-05-09T06:47:24.017 に答える
1

awk、はい、頭と貼り付け。

$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -
于 2012-05-10T01:17:24.573 に答える
1

醜い解決策:

awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047  file ")}' file
于 2012-05-09T11:50:37.947 に答える
1

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

perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt
于 2012-05-09T06:44:13.283 に答える