使用 grep 精确匹配多个字符串

使用 grep 精确匹配多个字符串

我正在使用 grep 寻找多个字符串的精确字符串匹配。

假设我想在一个大约有 1000 万行和 10 列的大型数据文件中找到以下三个字符串。我想查询该文件,以便找到其中包含以下确切字符串的所有行。值得庆幸的是,只有 1 列有“rs 数字”,所以我不需要指定列: 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

where-F为您提供精确的字符串匹配(无正则表达式),-w是整个单词,并-f从进程替换提供的文件中读取“模式”。

如果你有更多的单词需要匹配,导致 printf 部分变得很长,你可以使用 shell 数组来保存它们:

words=( rs123 rs246 rs689653 )
grep -Fwf <(printf "%s\n" "${words[@]}") file

或者,awk 可能可以满足您的需求:

awk -F '\t' '
    $6 == "rs123"
    $6 == "rs246"
    $6 == "rs689653"
' file

根据需要替换实际的字段分隔符和字段编号。

相关内容