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