grep は複数の正規表現を検索し、発生回数を計算します。

grep は複数の正規表現を検索し、発生回数を計算します。

複数の正規表現を検索し、各正規表現の一致数を数える必要があるファイルがあるとします。

したがって、次のパターンを組み合わせることはできません。

grep -Po '{regex_1}|{regex_2}|...|{regex_n}' file | wc -l

...各正規表現の発生回数が必要だからです。

明らかにすることができます:

occurences[i]=$(grep -Po "${regex[i]}" file | wc -l)

...しかし、残念ながら、見つかったファイルは非常に大きくなる可能性があり(> 1 GB)、確認する必要があるパターンが多く(数千の範囲)、同じファイルを複数回読み取る必要があるため、プロセスは非常に遅くなります。

これをすばやく実行する方法はありますか?

ベストアンサー1

おそらくawk最速のシェルツールです。あなたは試すことができます:

awk "/$regex1/ { ++r1 }
     /$regex2/ { ++r2 }"'
     END { print "regex1:",r1 "\nregex2:",r2 }' <infile

perlもちろん、あなたの質問のように正規表現を使用する必要がある場合は、perlそれが唯一の答えです。ただし、基本式の代わりにawk拡張式(たとえば)を使用します。grep -E

おすすめ記事