【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;
}