awkガナス

第2回 タイムスタンプで集計

2015.06.03

今回はタイムスタンプによって集計する方法について書きます。

今回も ls -l の出力を使用します。集計は連想配列を使って行います。

ls -l の出力はファイルのタイムスタンプは6,7番目のフィールドにあります。タイムスタンプによって集計するため連想配列の添字に日付を指定して値を加算します。

% ls -l /bin/|awk '/^-/{sum[$6 $7]+=$5}END{for(mon in sum)print mon,sum[mon]}'
4月12 64992
1月10 126096
9月18 472388
7月17 42805
3月13 5600
5月23 63180
2月13 63692
..

日付をソートして出力するため、sort をパイプで実行します。sort に -n オプションを付けないと 10,11,12月が先に表示されるので -n オプションを忘れないように。

% ls -l /bin/|awk '/^-/{sum[$6 $7]+=$5}END{for(mon in sum)print mon,sum[mon]}'|sort -n
1月10 126096
1月19 485304
1月29 12052
1月7 110156
2月13 63692
2月17 470076
2月19 341642
2月4 347540
2月5 5528
..

添字の月と日付の間にスペースを入れたい場合は$6,$7の間に ” ” をつけて sum[$6” “$7]とします。

% ls -l /bin/|awk '/^-/{sum[$6" "$7]+=$5}END{for(mon in sum)print mon,sum[mon]}'|sort -n
1月 10 126096
1月 19 485304
1月 29 12052
1月 7 110156
2月 13 63692
2月 17 470076
2月 19 341642
2月 4 347540
2月 5 5528

添字を “$6 $7” とダブルコートで囲むと $6,$7 がフィールドの値にならずに文字列”$6 $7”が添字になるので気をつけましょう。

% ls -l /bin/|awk '/^-/{sum["$6 $7"]+=$5}END{for(mon in sum)print mon,sum[mon]}'|sort -n
$6 $7 9420037

すこし処理が長くなってきたので処理をファイルに記述します。ファイルに記述する場合は 中括弧の部分だけを記述します。シングルコートは必要ありません。

% cat sum
/^-/{
  sum[$6" "$7]+=$5
}
END{
  for(mon in sum)print mon,sum[mon]
}
% ls -l /bin/|awk -f sum

先頭行に #! /usr/bin/awk -f を記述するとファイル名で実行できます。

% cat sum
#! /usr/bin/awk -f
/^-/{
  sum[$6" "$7]+=$5
}
END{
  for(mon in sum)print mon,sum[mon]
}
% chmod +x sum
% ls -l /bin/|./sum

日付の出力の桁があっていないので桁合わせをしたい場合は ENDセクションで添字をsplitコマンドで分割して表示するようにします。

#! /usr/bin/awk -f
/^-/{
    sum[$6" "$7] += $5
}
END{
    for(date in sum){
        split(date,arr, " ")
        printf("%5s %2s %d\n", arr[1], arr[2], sum[date])
    }
}
$ ls -l /bin/| ./sum|sort -n
1月  7 110156
1月 10 126096
1月 19 485304
1月 29 12052
2月  4 347540
2月  5 5528
..

著者プロフィール

naka

すきなコマンドは awk と bc です。なにかを計算する時、awk か bc を使います。

記事一覧Index