grep 選択的に

grep 選択的に

私はbashから1000以上の指定子のファイルを持っています

for desig in $(desfile)
do
  grep $desig in listfile
done

リストファイルは100万行以上になる可能性があるため、速度が重要です。

問題は、次のような指示子の場合です

PA0EHH
DL/PA0EHH

PA0EHH2回見つかった

awk はより選択的である可能性があるが、非常に遅いことがわかりました。

答え1

grep -xF -f desfile listfile

または、desfileがコマンドの場合、

grep -xF -f <(desfile) listfile

または、

desfile | grep -xF -f /dev/stdin listfile

ここで使用されるオプションは

  • -xは、行全体にわたって一致する必要があります。これは、行内の部分文字列と一致しないようにするために使用します。
  • -Fは、正規表現のマッチングではなく文字列の比較を使用します。これによりクエリが高速化され、パターンに正規表現で特別な文字が含まれている場合に必要になります (ただし、特別な文字にしたくない場合)。
  • -f filenameコマンドラインの文字列ではなくファイルからパターンを読み込みます。これは、パターンの数が中程度の場合に有効です。多くのパターンによってはメモリ不足になる場合があります。その場合は、を使用して(またはコマンドの場合はdesfile出力を)いくつかの小さなファイルに分割し、それらを繰り返し処理することをお勧めします。いずれにしても、desfilesplitないgrepパターンごとに1回呼び出したい!

答え2

指定子が各行の先頭であるかどうかを確認する場合は、

grep ^$desig listfile

最初のヒットだけに制限したい場合は、 switch を追加します-m 1
よりきめ細かい検索が必要な場合は、正規表現を試してください。

testval=2
seq 40 | grep -e ^$testval\\b
seq 40 | grep -e \\b$testval\\b

どちらも、ユースケースに応じて、正確に2に一致します。また、grepが例えば認識しないようにするには、2/2

echo "2/2 2" | grep -e [^\/]\\b$testval\\b

私のバッシュの色は孤独な2つだけです。

答え3

パフォーマンスが懸念事項であるため、多くの場合ripgrepよりもベンチマークが高速になる の使用を検討します。grep

関連情報