我正在使用 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
根据需要替换实际的字段分隔符和字段编号。