awkで列の合計を求める
Pocket

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

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

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

awk '{a+=$2} END{print a;}' ファイルPATH
[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を実行する。

awk '{a[$1]+=$2} END{for(k in a)print k,a[k];}' ファイルPATH
[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
Sponsored Links

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

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

awk '{sum=$3+$4; print $0,sum}' ファイルPATH
[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で足していくとよいだろう。

awk 'a=0;{for(i=1;i<=NF;i++){a+=$i};print a}' ファイルPATH
[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の先頭にいれている変数の初期化を外すことでファイル内のすべての値を行列合計して出力させることができる。

awk '{for(i=1;i<=NF;i++){a+=$i}}END{print a}'
[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

 

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。