【Lifehacks】ファイルを縦に集計
■タスク
・一覧データをキー項目に着目し、出現件数を集計する。
■前提条件
・一覧データは短項目、CSV、TSVファイル形式など。
・一覧データはキー項目を持つ。
・一覧データはキー項目で整列済みとする。
■備考
・一覧データの形式に合わせ、行からキー項目を取得する関数を&SgGetItem()に実装することで任意の形式に利用可能。
■利用例
・ログを年、月、日、時などで集計。
・ログをユーザID、組織IDなどで集計。
■使用方法
> perl SgCntVertical.pl < Data.txt > Result.txt
■プログラム
# # SgCntVertical.pl # 入力ファイルを縦に集計。 # # Author: Orihika Ikuo # Create: 2007.11.07 # Update: 2008.01.22 # use strict; use warnings; &SgCntVertical(); sub SgCntVertical { my $line; my $cur_item; my $item; my $cnt; # 最初の行からキー項目を取得 $line = <STDIN>; $cur_item = &SgGetItem($line); seek(STDIN, 0, 0); $cnt = 0; while ($line = <STDIN>) { chomp($line); # キー項目を取得 $item = &SgGetItem($line); # キー項目が同じ間はカウントアップ if ($item eq $cur_item) { $cnt++; # キー項目が変わったら出力して着目キー項目を変更、カウントを1にする } else { print("$cur_item\t$cnt\n"); $cur_item = $item; $cnt = 1; } } } # レコードからキー項目を抽出(対象データ形式により変更要) sub SgGetItem { my($line) = @_; chomp($line); return $line; }