私は複数の文字列の正確な文字列一致を見つけるためにgrepを使用しています。
約1000万の行と10個の列を持つ大規模なデータファイルで、次の3つの文字列を探したいとします。以下の正確な文字列を含むすべての行を見つけるためにこのファイルを照会したいと思います。幸いなことに、1つの列にのみ「rs number」があるため、列を指定する必要はありません。 rs123 rs246 rs689653
次の式を試しましたが、この文字列を含むすべてのオプションが返されました。場合によっては、正確に一致する行だけが必要なため、「rs123456」などの行が表示されます。
grep -E 'rs123|rs246|rs689653' queriedfile.txt
^
その後、andを使用して次の式を試しましたが、$
私のクエリと一致する結果が得られませんでした(いくつかあることがわかりました)。
grep -E '^rs123$|^rs246$|^rs689653$' queriedfile.txt
答え1
-w
単語全体の一致を制限するためにコマンドラインオプションを追加できます。
$ printf 'rs123456\nrs246\n' | grep -wE 'rs123|rs246|rs689653'
rs246
または、単語アンカーを明示的に追加します。
$ printf 'rs123456\nrs246\n' | grep -E '\b(rs123|rs246|rs689653)\b'
rs246
(あなたは近い^
-$
しかしそれはワイヤー-アンカー)。
答え2
欲しいなら精密文字列一致:
grep -Fwf <(printf "%s\n" rs123 rs246 rs689653) file
ここでは、-F
正確な文字列一致(正規表現なし)を提供し、完全な単語であり、-w
プロセス-f
の置き換えで提供されるファイルから「パターン」を読みます。
一致する単語が多くなり、printfセクションが非常に長くなった場合は、シェル配列を使用して保存できます。
words=( rs123 rs246 rs689653 )
grep -Fwf <(printf "%s\n" "${words[@]}") file
あるいは、awkはあなたのニーズに合うかもしれません。
awk -F '\t' '
$6 == "rs123"
$6 == "rs246"
$6 == "rs689653"
' file
必要に応じて実際のフィールド区切り記号とフィールド番号を置き換えます。