• 締切済み

文字列をグループ毎に集計する

集計を行いたいテキストデータとして、以下のようなものがあります。 あいうえお かきくけこ さしすせそ あいうえお かきくけこ EOS かきくけこ さしすせそ さしすせそ あいうえお さしすせそ EOS あいうえお かきくけこ かきくけこ かきくけこ さしすせそ EOS このデータに対して、EOSが出現するまでを一つのグループとして重複する文字列の集計を行いたいです。 EOS毎に繰り返し処理を行えば良いのではないかと考えてはいるのですが、そのプログラムがどうしても作れません。 最終的な集計結果としては、 あいうえお 2 かきくけこ 2 さしすせそ 1 さしすせそ 3 あいうえお 1 かきくけこ 1 かきくけこ 3 あいうえお 1 さしすせそ 1 というようにしたいです。 よろしくお願いします。

みんなの回答

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.2

こんな感じでいかかでしょうか? my %count_of; my @result; while ( my $line = <DATA> ) { chomp $line; if ( $line eq 'EOS' ) { push @result, {%count_of}; %count_of = (); } else { ++$count_of{$line}; } } for my $count_of (@result) { my @sorted_data = map "$_->[0] $_->[1]", sort { $b->[1] <=> $a->[1] or $a->[0] cmp $b->[0] } map [ $_, $count_of->{$_} ], keys %$count_of ; print join("\n", @sorted_data), "\n\n"; } __DATA__ あいうえお かきくけこ さしすせそ あいうえお かきくけこ EOS かきくけこ さしすせそ さしすせそ あいうえお さしすせそ EOS あいうえお かきくけこ かきくけこ かきくけこ さしすせそ EOS

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

BEGIN {初期化} while (<>) { if /^EOS$/) { 集計結果を出力する 初期化 } else { 集計 } } くらい?

関連するQ&A