私はbashから1000以上の指定子のファイルを持っています
for desig in $(desfile)
do
grep $desig in listfile
done
リストファイルは100万行以上になる可能性があるため、速度が重要です。
問題は、次のような指示子の場合です
PA0EHH
DL/PA0EHH
PA0EHH
2回見つかった
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
出力を)いくつかの小さなファイルに分割し、それらを繰り返し処理することをお勧めします。いずれにしても、desfile
split
ない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