グラフ付きで何時毎にファイルを編集しているか集計する

前回のAWK Users JP :: 何時毎にファイルを編集しているか集計するでは何時ごろにファイルを編集することが多い? - みずぴー日記にインスパイヤーされて同様の集計をしたものの、CUI でのグラフ表示を行っていませんでした。

そこで、今回は CUI でのグラフを含めて作成してみます。 引数に数値 (num)、最大値 (max)、バーグラフの幅 (width)、文字 (char) といったものを取ることで、汎用性を考慮した関数を作成しました。

#! /usr/local/bin/nawk -f
# edit_time_2.awk
# 何時頃にファイルを編集しているか集計する
# usage: nawk -f edit_time_2.awk [dir]

BEGIN {
    dir = ARGV[1] ? ARGV[1] : ".";
    find_stat_exec = "/usr/bin/find " dir " -type f "\
                     "| /usr/bin/xargs /usr/bin/stat --format='%Y %n'";
    split(ENVIRON["TZ"], arr_tz, /[+-]/);
    time_zone = arr_tz[2] * 3600;

    while ((find_stat_exec | getline) > 0) {
        hour = int(($1 + time_zone) / 3600) % 24;
        edit_time[hour]++;
        total++;
    }
    close(find_stat_exec);

    for (i = 0; i <= 23; i++) {
        printf("%2d: %s (%5.2f %%)\n", i,\
               mk_bar_graph(edit_time[i] / total * 100, 100, 70, "*"),\
               edit_time[i] / total * 100);
    }
}

# mk_bar_graph():   CUI 用にバーグラフを作成します
#   in:     数値 (num)
#           最大値 (max)
#           バーグラフの幅 (width)
#           文字 (char)
#   out:    最大値で指定されたバーグラフの幅になるような文字列
function mk_bar_graph(num, max, width, char,     str, i) {
    for (i = 0; i <= int(width / max * num); i++) {
        str = str char;
    }
    return str;
}

コアの部分は前回と同じです。 実行した結果は以下のとおりです。

$ nawk -f edit_time_2.awk
 0: ****************************************** (59.56 %)
 1: * ( 0.99 %)
 2: ** ( 1.72 %)
 3: * ( 0.37 %)
 4: * ( 0.42 %)
 5: * ( 0.00 %)
 6: * ( 0.00 %)
 7: * ( 0.00 %)
 8: * ( 0.10 %)
 9: * ( 0.05 %)
10: * ( 0.57 %)
11: * ( 0.73 %)
12: * ( 0.26 %)
13: * ( 0.10 %)
14: * ( 0.37 %)
15: * ( 0.00 %)
16: * ( 0.37 %)
17: * ( 0.10 %)
18: * ( 1.15 %)
19: *** ( 3.50 %)
20: ** ( 2.51 %)
21: ******** (10.97 %)
22: **** ( 5.49 %)
23: ******** (10.66 %)

内容としてはキミならどう書く 2.0 - ROUND 3 - — Lightweight Language Ringに記載されているものと同じようなものです。 以前私が作成した解答はキミならどう書く 2.0 - ROUND 3 - まとめにまとめていますので合わせてご覧ください。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png