OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

ファイルからある文字列の個数を数えたい

  • すぐに回答を!
  • 質問No.198863
  • 閲覧数1930
  • ありがとう数4
  • 気になる数0
  • 回答数3
  • コメント数0

perl5でunixの"wc"や"grep -c"みたいに1つのファイルの中からある文字列の個数を
カウントするスクリプトを作ろうとしています。

ファイルは256文字×10万行くらいのテキストで、
検索する文字列は15文字前後×40個(例えば「apple-000001」「lemon_orange」など)です。

どのようなスクリプトを組んだら効率よく各文字列をカウントできるのでしょうか?
それよりwcやgrep -cを40回行った方が早いのでしょうか?
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル11

ベストアンサー率 47% (160/334)

最終的な速度については分かりませんが,Perl で効率良く実現しようというのであれば,配列(下の例では @pattern)に照合する文字列を入れておいて,ファイルから一行読むごとに,

foreach $pattern (@pattern) {
$count{$pattern} += /$pattern/g; #行の内容は $_ に入っていると仮定
}

とかしてやればよいのではないでしょうか。
一行にパターンが必ず一回しか現れないのであれば,2行目は,

$count{$pattern}++ if (/$pattern/);

とかすることも可能でしょう。

上記コードでは,パターン照合回数は grep を使ったときと同じですが,ファイルI/Oの回数は 1/パターン数 で済みます。が,パターン照合の速度そのものは grep のほうが速いでしょうから,最終的にどちらが速いかはやってみないと分かりません。

ちなみに,Perl のパターンマッチング処理は,一般に sed と同等或いはより高速だと言われているので,sed を使う意味はあまりないと思います。
補足コメント
noname#41382

1000行25パターンのテストデータでやってみたところ
grep(25回)はperlの1.5倍処理時間がかかりました。
ということでperlで処理したいと思います。
ありがとうございました。
投稿日時 - 2002-01-18 18:35:04
お礼コメント
noname#41382

ご回答ありがとうございました。
まさにperlやりたかった内容です!
grepと比較検討してみたいと思います。
#見た目的にはperl処理かな ^ ^;)
投稿日時 - 2002-01-18 09:02:03
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

直接の回答にはならないかもしれません。 > それよりwcやgrep -cを40回行った方が早いのでしょうか? wc や grep は、複数のファイルを一度に処理できますから、起動は一回だけで 済みます。 # 特定の単語を探すのであれば、wc には無理ですね。 perl もかなり早いんですが、(環境にもよりますが)grep なんかは、それなりに 速さを要求されてきて育ってき ...続きを読む
直接の回答にはならないかもしれません。

> それよりwcやgrep -cを40回行った方が早いのでしょうか?

wc や grep は、複数のファイルを一度に処理できますから、起動は一回だけで
済みます。

# 特定の単語を探すのであれば、wc には無理ですね。

perl もかなり早いんですが、(環境にもよりますが)grep なんかは、それなりに
速さを要求されてきて育ってきたプログラムですから、下手なスクリプトを書くよりは
ずーっと早いです。

もし探す文字が、固定で構わない(つまり、正規表現を使わない)のであれば、
fgrep を使うのが一番早いんじゃないかと思います。
補足コメント
noname#41382

回答ありがとうございます。

>grep は、複数のファイルを一度に処理できますから、起動は一回だけで済みます。
>
ファイルは1つです。その中で検索する文字列が40個あります。
それぞれの個数を調べるにはやはり40回のgrepが必要ですか?

あと、その前後の処理をperlで書いてしまっているので、perl上で処理できるように
したいというのがあります。
また、systemコマンドでgrepを呼んだとすると、その結果をperlで処理するのはどうするのでしょうか?
grepの結果をファイルに一度結果を出力する必要があるのでしょうか?
投稿日時 - 2002-01-15 19:08:57


  • 回答No.2
レベル14

ベストアンサー率 50% (1122/2211)

> また、systemコマンドでgrepを呼んだとすると、その結果をperlで処理するのはどうするのでしょうか? パイプを使います。perl は普段使わないので、怪しいのですが、こんな感じになるはず。 open IN, "grep なんとかかんとか |" or die "error\n"; while ( <IN> ) {   何か ...続きを読む
> また、systemコマンドでgrepを呼んだとすると、その結果をperlで処理するのはどうするのでしょうか?

パイプを使います。perl は普段使わないので、怪しいのですが、こんな感じになるはず。

open IN, "grep なんとかかんとか |" or die "error\n";
while ( <IN> ) {
  何か $_ を使った処理。例えば…
  print;
}
close IN;


> ファイルは1つです。その中で検索する文字列が40個あります。

ああ、そういうことなのね。ちょっと迷いますね。

sed で、一行一単語にばらしつつ、検索する文字列を含む行だけを抽出しておいて、その出力を perl で
処理してカウントして行くのが一番軽いかな?
お礼コメント
noname#41382

さらなるご回答ありがとうございます。
パイプの使い方大変参考になりました。
sedのほうは、atonさんが回答していただいた処理と比較検討してみたいと思います。
投稿日時 - 2002-01-18 08:57:10
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ