私が使用している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
各パターンごとに一度呼び出したいです!
答え2
インジケーターが各行の始まりであることを確認している場合は、次のことができます。
grep ^$desig listfile
最初のクリックに制限するには、スイッチを追加してください-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
私のbashにはSolitudeの2色しかありません。
答え3
パフォーマンスが問題であるため、多くの場合ripgrep
よりもベンチマークの方が速いと見なされます。grep