No.3ベストアンサー
- 回答日時:
最終的な速度については分かりませんが,Perl で効率良く実現しようというのであれば,配列(下の例では @pattern)に照合する文字列を入れておいて,ファイルから一行読むごとに,
foreach $pattern (@pattern) {
$count{$pattern} += /$pattern/g; #行の内容は $_ に入っていると仮定
}
とかしてやればよいのではないでしょうか。
一行にパターンが必ず一回しか現れないのであれば,2行目は,
$count{$pattern}++ if (/$pattern/);
とかすることも可能でしょう。
上記コードでは,パターン照合回数は grep を使ったときと同じですが,ファイルI/Oの回数は 1/パターン数 で済みます。が,パターン照合の速度そのものは grep のほうが速いでしょうから,最終的にどちらが速いかはやってみないと分かりません。
ちなみに,Perl のパターンマッチング処理は,一般に sed と同等或いはより高速だと言われているので,sed を使う意味はあまりないと思います。
この回答への補足
1000行25パターンのテストデータでやってみたところ
grep(25回)はperlの1.5倍処理時間がかかりました。
ということでperlで処理したいと思います。
ありがとうございました。
ご回答ありがとうございました。
まさにperlやりたかった内容です!
grepと比較検討してみたいと思います。
#見た目的にはperl処理かな ^ ^;)
No.2
- 回答日時:
> また、systemコマンドでgrepを呼んだとすると、その結果をperlで処理するのはどうするのでしょうか?
パイプを使います。perl は普段使わないので、怪しいのですが、こんな感じになるはず。
open IN, "grep なんとかかんとか |" or die "error\n";
while ( <IN> ) {
何か $_ を使った処理。例えば…
print;
}
close IN;
> ファイルは1つです。その中で検索する文字列が40個あります。
ああ、そういうことなのね。ちょっと迷いますね。
sed で、一行一単語にばらしつつ、検索する文字列を含む行だけを抽出しておいて、その出力を perl で
処理してカウントして行くのが一番軽いかな?
さらなるご回答ありがとうございます。
パイプの使い方大変参考になりました。
sedのほうは、atonさんが回答していただいた処理と比較検討してみたいと思います。
No.1
- 回答日時:
直接の回答にはならないかもしれません。
> それよりwcやgrep -cを40回行った方が早いのでしょうか?
wc や grep は、複数のファイルを一度に処理できますから、起動は一回だけで
済みます。
# 特定の単語を探すのであれば、wc には無理ですね。
perl もかなり早いんですが、(環境にもよりますが)grep なんかは、それなりに
速さを要求されてきて育ってきたプログラムですから、下手なスクリプトを書くよりは
ずーっと早いです。
もし探す文字が、固定で構わない(つまり、正規表現を使わない)のであれば、
fgrep を使うのが一番早いんじゃないかと思います。
この回答への補足
回答ありがとうございます。
>grep は、複数のファイルを一度に処理できますから、起動は一回だけで済みます。
>
ファイルは1つです。その中で検索する文字列が40個あります。
それぞれの個数を調べるにはやはり40回のgrepが必要ですか?
あと、その前後の処理をperlで書いてしまっているので、perl上で処理できるように
したいというのがあります。
また、systemコマンドでgrepを呼んだとすると、その結果をperlで処理するのはどうするのでしょうか?
grepの結果をファイルに一度結果を出力する必要があるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) googleスプレッドシートでカッコ内の文字数をカウントしたい 1 2023/01/17 15:52
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- UNIX・Linux bashスクリプトのgrepで3XXの検索の仕方について 2 2022/09/06 21:35
- その他(IT・Webサービス) 文字を種類ごとに分けてカウントしてくれるサイトなどご存知だったら教えてください。 私はあるゲームの確 1 2022/11/23 18:53
- UNIX・Linux bashでブランク(空白)を検索文字列として指定する方法 1 2022/04/13 22:29
- Visual Basic(VBA) vbaサブフォルダーをワイルドカードで取得したい 2 2022/11/15 08:04
- Visual Basic(VBA) excelにて、特定の列に数字入力してあれば、入力してある行コピーして 別ファイルに張り付ける 2 2022/08/11 05:33
- 計算機科学 急ぎです、大学数学再帰の問題難しくてがわからないです。 以下の4つの文字列を連結して新たに生成できる 1 2023/05/17 20:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
Javaで同一のファイルを読み込...
-
ファイルのアップロード方法(Perl)
-
perlで、後ろの行を読んで、前...
-
VB6.0でDB接続する際に切断時の...
-
ExcelをCSV書き出す場合のシー...
-
CGI(Perl)でWeb上から作成...
-
ファイルからある文字列の個数...
-
エクセルVBA コードが同じでも...
-
datファイルってなんですか?
-
タブの色を変更する方法
-
【PHP】アクセス過多でファ...
-
ファイル全てを .xlsm に変更し...
-
VBAでタブ区切りテキストの保存...
-
エクセルVBAで素数だけを出力す...
-
コマンドプロンプトからperlを...
-
perlでcsvファイルを読む(ダブ...
-
Perlで特定行から特定行までを...
-
flockについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルの特定行を書...
-
openした後、closeしないでプロ...
-
ReadLineでの読み出し行を指定する
-
エクセルVBA コードが同じでも...
-
csvファイル改行コードの置換に...
-
C言語でのファイルのデータ更...
-
Perlの変数に文字数制限(容量...
-
perlにて2つのファイル比較
-
JavaでCSVファイルを高速に読む...
-
VB6.0でDB接続する際に切断時の...
-
MATLAB グローバル変数の宣言
-
alarmのタイムアウト後の処理で...
-
DBMとテキストファイルのどちら...
-
perlで、後ろの行を読んで、前...
-
エクセルVBAでCSVファイ...
-
拡張子 ”log” と ” dat” の違い
-
5行おきに5行ずつ抽出するに...
おすすめ情報