hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

Perlでtsvファイル等の同じ行をカウントしてみるスクリプト

tsvファイルの先頭2列が同じ値の行数をカウントするPerlスクリプトです。

例えば、

元ファイル
列A 列B
hogehoge 12345
foobar 99999
hogehoge 12345

を、

出力されるファイル
列A 列B 行数
hogehoge 12345 2
foobar 99999 1

みたいにするものです。

今回はかなり手抜きなので、先頭2列しか対応できません。(※本当は再帰関数とか作ってn列にも対応できるようしたほうが良いですね。)
忘れっぽいので、自分用の備忘録として、とりあえずコードだけ載せておきます。

サンプルコード(全体)

#!/usr/bin/perl
#
# hash_key_total.pl
#
use strict;
use warnings;
use Carp;

my $delimiter = '\t';
my %hash;

# 1つの引数が必要
if( @ARGV != 1 ){
    die "Use:\n$0 fileName \n";
}

# ファイル名を取得
my $fileName = shift;

# ファイルの存在チェック( -f でファイルの存在確認 )
croak "$fileName don't exist $!" unless -f $fileName;

# コマンド引数で受け取ったファイルを開く
open( IN, $fileName) or die $!;
while(<IN>){
    s/\r\n|\n|\r//g;
    my @row  = split/$delimiter/;

    # 先頭2列をキーにしたハッシュ配列に+1を加算
    $hash{"$row[0]"}->{"$row[1]"} = $hash{"$row[0]"}{"$row[1]"} ? $hash{"$row[0]"}{"$row[1]"}+1 : 1;
}
close(IN);

# ハッシュの第1キーでソートしてforeach
foreach my $key1 (sort keys %hash )
{
    # ハッシュの第2キーでソートしてforeach
    foreach my $key2 (sort keys %{$hash{$key1}} )
    {
        # 第1キーと第2キーをキーにして値を取り出し
        print "$key1\t$key2\t$hash{$key1}->{$key2}\n";
    }
}

使い方

使い方と言うほどもモノではありませんが、デフォルトは標準出力なので、ファイルに書き込む場合はリダイレクトさせます。

標準出力させる場合
$ ./hash_key_total.pl hoge.tsv
標準出力させる場合
$ ./hash_key_total.pl hoge.tsv > hoge_count.tsv

今回参考にしたページ

Perl 多次元連想配列 - えむもじら
http://level.s69.xrea.com/mozilla/index.cgi?id=20070101_Hash

【CGI・Perl】二次元ハッシュを作成する (Perl)
http://katsubemakito.net/cgiperl/variable/hash/perl-hashu2jigen.html

コマンドライン引数 - サンプルコードによるPerl入門
http://d.hatena.ne.jp/perlcodesample/20080108/1199797532