時間ごとの wc

awkか!awk使えばいいのんか!からですが、コメントにも書きましたが、結果的にどういった解答が欲しいのかがないのであくまで推測で進めます。

  • ファイル名は 'YYYYMMDDHHMMSS.csv' とします。
  • 時間ごとに行数をまとめたい。

以上のように仮定して、解くと以下のようになります。

#! /usr/bin/gawk -f
# 1hour_wc.awk

BEGIN {

    for (i = 1; i < ARGC; i++) {
        time = substr(ARGV[i], 1, 10);

        if (!(time in prev_time)) {
            wc_cmd = "wc -l " time "*.csv";
            prev_time[time] = time;

            while (wc_cmd | getline > 0) {
                lines = $1;
            }
            close(wc_cmd);

            print time " : " lines " lines.";
        }
    }
}

これを試すのにテストファイルを用意します。

$ wc *csv
  10   10   21 20080806000845_aho.csv
 100  100  292 20080806233612_aho.csv
1000 1000 3893 20080806234023_aho.csv 1110 1110 4206 合計

テストということで中身は seq コマンドで適当な数字が入っています。

では実行してみましょう。

$ nawk -f 1hour_wc.awk *csv
2008080600 : 10 lines.
2008080623 : 1100 lines.

こういうので良いのでしょうか? 手元に Solaris がないこともあって nawk での動作確認までは行っています。

スクリプトの中身は、既に wc をしてしまっている日付を配列に格納して、それらとマッチしない場合にのみ wc コマンドを実行するようにしています。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png