ちょっとやり方ど忘れしてググった際にうまいこと出てこなかったので、念のため残しておく。日本語って難しいなぁと…。

1.指定した列の合計を求める

特定の列全体の合計を求める場合は、以下のようにforで対象の列を足していく。
例えば2列目の合計のみを求める場合なら、以下のようにコマンドを実行する。

bash
awk '{a+=$2} END{print a;}' ファイルPATH
shell
[root@BS-PUB-CENT7-01 tmp]# cat test5.txt 1 2 3 1 2 1 2 2 1 3 1 2 3 1 2 2 2 2 1 2 4 2 2 2 1 2 1 1 1 3 2 2 1 2 2 1 3 2 2 1 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 3 [root@BS-PUB-CENT7-01 tmp]# cat test5.txt | awk '{a+=$2} END{print a;}' 20

グループ集計を行う、といった場合は、以下のようにawkを実行する。

bash
awk '{a[$1]+=$2} END{for(k in a)print k,a[k];}' ファイルPATH
shell
[root@BS-PUB-CENT7-01 tmp]# cat test1_2.txt name prefecture value aaa 1 123 bbb 2 544 ccc 1 65745 ddd 1 122 eee 2 222 fff 1 444 ggg 3 566 hhh 4 111 iii 3 12 bbb 2 1243 ddd 1 4423 [root@BS-PUB-CENT7-01 tmp]# cat test1_2.txt | sort aaa 1 123 bbb 2 1243 bbb 2 544 ccc 1 65745 ddd 1 122 ddd 1 4423 eee 2 222 fff 1 444 ggg 3 566 hhh 4 111 iii 3 12 name prefecture value [root@BS-PUB-CENT7-01 tmp]# cat test1_2.txt | sort | awk 'NR>1{a[$1]+=$2} END{for(k in a)print k,a[k];}' hhh 4 ccc 1 eee 2 ggg 3 name 0 iii 3 bbb 4 ddd 2 fff 1

2.各行の列と列の合計を求める

各行の指定した列と列の合計を出す場合は、以下のように単純にawkで列同士を足してやればよい。
以下の例では、3列目と4列目を足してIOPSの値を求めている。

bash
awk '{sum=$3+$4; print $0,sum}' ファイルPATH
shell
[root@BS-PUB-CENT7-01 tmp]# cat /tmp/test_dstat.txt time | read writ 09-05 08:51:56| 0.01 0.02 09-05 08:51:57| 4.22 0.03 09-05 08:51:58| 4.33 0.12 09-05 08:51:59| 5.64 1.02 09-05 08:52:00| 12.3 3.04 09-05 08:52:01| 33.4 12.3 09-05 08:52:02| 333 24.5 09-05 08:52:03| 234 33.2 [root@BS-PUB-CENT7-01 tmp]# cat /tmp/test_dstat.txt | awk 'NR>1{sum=$3+$4; print $0"\t"sum}' 09-05 08:51:56| 0.01 0.02 0.03 09-05 08:51:57| 4.22 0.03 4.25 09-05 08:51:58| 4.33 0.12 4.45 09-05 08:51:59| 5.64 1.02 6.66 09-05 08:52:00| 12.3 3.04 15.34 09-05 08:52:01| 33.4 12.3 45.7 09-05 08:52:02| 333 24.5 357.5 09-05 08:52:03| 234 33.2 267.2

列が何列あるのかが行によって異なっており、特定の列以降の列はすべて合計するといった場合は、以下のようにforで足していくとよいだろう。

bash
awk 'a=0;{for(i=1;i<=NF;i++){a+=$i};print a}' ファイルPATH
shell
[root@BS-PUB-CENT7-01 tmp]# cat /tmp/test5.txt 1 2 3 1 2 1 2 2 1 3 1 2 3 1 2 2 2 2 1 2 4 2 2 2 1 2 1 1 1 3 2 2 1 2 2 1 3 2 2 1 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 3 [root@BS-PUB-CENT7-01 tmp]# cat /tmp/test5.txt | awk '{a=0;for(i=1;i<=NF;i++){a+=$i};print a}' 9 9 9 13 12 13 9 12 6 10

なお、全部を合計する場合は、awkの先頭にいれている変数の初期化を外すことでファイル内のすべての値を行列合計して出力させることができる。

bash
awk '{for(i=1;i<=NF;i++){a+=$i}}END{print a}'
shell
[root@BS-PUB-CENT7-01 tmp]# cat /tmp/test5.txt | awk '{a=0;for(i=1;i<=NF;i++){a+=$i};print a}' 9 9 9 13 12 13 9 12 6 10 [root@BS-PUB-CENT7-01 tmp]# cat /tmp/test5.txt | awk '{a=0;for(i=1;i<=NF;i++){a+=$i};print a}' | numsum 102 [root@BS-PUB-CENT7-01 tmp]# cat /tmp/test5.txt | awk '{for(i=1;i<=NF;i++){a+=$i}}END{print a}' 102