[Perl]複数カラムのあるデータのソート
ソートは昇順として実装してあります.
Perlのバージョンが5.8.6以降でないとsort関数が安定じゃないのでこれより新しいものにして下さい.
区切られてる文字によって
16行目
my @strlist = split(/ /, $_);
を変えて下さい.
use strict; use warnings; my $input_file_path = shift; my $output_file_path = shift; my @sort_key = @ARGV; my $sort_key_number = @sort_key; my @sort_target; open my $fh, "< ".$input_file_path; my $index = 0; while(<$fh>){ chomp($_); #space一個でカラムが区切られてるとする. my @strlist = split(/ /, $_); my $hash; foreach my $key(@sort_key){ $hash->{$key} = $strlist[$key]; } $hash->{"index"} = $index; push(@sort_target, $hash); $index++; } close($fh); #sort my @sorted = @sort_target; foreach my $key(reverse @sort_key){ @sorted = sort { $a->{$key} <=> $b->{$key} } @sorted; } open my $out, ">".$output_file_path; foreach my $hash_tmp (@sorted){ my $index_number = $hash_tmp->{"index"}; my $i = 0; open my $in, "< ".$input_file_path; while(<$in>){ if($i eq $index_number){ print $out $_; last; }else{ $i++; } } close($in) } close($out);
使い方は,
$perl MargeSort.pl 入力ファイル 出力ファイル ソート順位が高い順に列数を指定(0から始まる) 例) $perl MargeSort.pl test2.dat hoge.txt 0 1
- 追記
id:hidekiyに指摘をもらったので訂正します.
chompの部分とか致命的ですね.