• ベストアンサー

perlでの特定文字列のカウント

ご教示お願いいたします。 perlについての質問です。 csvファイル内で、特定のカラムの中の、特定の文字列が何回出現するかマッチする回数をカウントしたいと考えています。 csvの中身は以下のような内容です。 yamada,20220522,jobA tanaka,20220521,jobB takahashi,20220521,jobB このcsvの最後のカラムに検索をかけ、「jobB」がいくつ出没するのかカウントしたいです。 この場合のスクリプトをどのように記述したらよいでしょうか? ワンライナーではなく、スクリプトファイルとしたいです。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.3

あ、そういえば chop; ではなくて chomp; の方が良かったですね 各行の改行文字を削除したいだけなので。 chompしておかないと、csvが3カラムしかなかった場合にsplit後の$cols[2] が "jobB<改行>" となってしまうため、"jobB" と等しくない、とされてしまうのです。

neko883
質問者

お礼

ありがとうございます。 参考にさせて頂き、思う通りの結果が出力されました。 丁寧な解説で、大変良くわかる解答でした。

その他の回答 (2)

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.2

>3カラム目、ユーザそれぞれのjob部分だけを検索し、カウントする場合 正規表現でマッチさせるか、ちゃんと各カラムに分割して判定するかでしょうね。 正規表現でやるなら判定部分をこんな感じに。※4カラム目以降が存在する必要あり。 $c++ if /^[^,]*,[^,]*,jobA,/ ちゃんとカラム分割するならば、 ---- count_jobB.pl ---- while(<>){ chop; @cols = split(/,/); $c++ if ($cols[2] eq "jobB"); } print $c ---- ここまで ---- こんな感じになります。

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.1

「最後」なのか「3カラム目」なのかで少々書き方が変わってきますが。 「最後」だとこれで良いですかね。 ---- count_jobA.pl ---- while(<>){ $c++ if /,jobA$/ } print $c ---- ここまで ---- これを perl count_jobA.pl < csvファイル のようにして実行します。 なおこのスクリプトは「始めて使う変数は0」「行末セミコロンはセパレータなので区切りを認識できるところでは不要」を利用した、少しダーティーな書き方をしています。 さらに「改行は見やすさのためだけであるので無くてもいい」までやると、 perl -e "while(<>){$c++ if /,jobA$/}print $c" <count.csv というワンライナーでも実行できます。

neko883
質問者

補足

ありがとうございます。 追加なのですが… 3カラム目、ユーザそれぞれのjob部分だけを検索し、カウントする場合、どのような記述になるでしょうか?

関連するQ&A