grep 字符串与字母和数字的精确匹配

grep exact match of string with alphabets and numbers

我正在使用 grep 从文件 1 中提取与文件 2 中的字符串匹配的行。文件 2 中的字符串既有字母也有数字。例如;

MSTRG.18691.1
MSTRG.18801.1

我用sed为文件2中的所有字符串写了字边界。

file 2
\<MSTRG.18691.1\>
\<MSTRG.18801.1\>

并使用了grep -f file2 file1

但输出有

MSTRG.18691.1.2
MSTRG.18801.1.3 also..

我想要完全匹配的行,

MSTRG.18691.1
MSTRG.18801.1

不是,

MSTRG.18691.1.2
MSTRG.18801.1.3

我的文件中只有几行1
t_name gene_name FPKM TPM<br> MSTRG.25.1 。 0 0<br> 核糖核酸71519。 93.398872 194.727926057583<br> 基因 34024 ND1 2971.72876 6195.77694943117<br> MSTRG.28.1 。 0 0<br> MSTRG.28.2 。 0 0<br> 核糖核酸71520。 33.235409 69.2927240732149

更新答案

您可以使用 start with ^end with $ 运算符来匹配 start with 和 begin with。要完全匹配 MSTRG.18691.1 您可以在两端添加 ^ & $ 并删除单词边界, 此外 . 在正则表达式中具有特殊含义以精确匹配 . 我们需要用反斜杠转义 \

示例模式:

^MSTRG\.18691\.1$
^MSTRG\.18801\.1$

文件1

MSTRG.18691.1
MSTRG.1311.1
MSTRG.18801.2
MSTRG.18801.3
MSTRG.18801.1.2
MSTRG.18801.1.1
MSTRG.18801.1
PrefixMSTRG.18801.1

新建一个普通文件file1,将上面的内容粘贴进去即可

file2(花样文件)

^MSTRG\.18801\.1$

新建一个普通文件file2,将上面的内容粘贴进去即可

运行 来自命令行的以下命令

grep -i --color -f file2 file1

结果:

MSTRG.18801.1

sed 添加对模式文件的更改

这里是 sed command 转义 . 并在您已有的模式文件的开头和结尾添加 ^$

sed -Ee 's/\./\./g' -e 's/^/\^/g' -e 's/$/$/g' file2 > file2_updated

-E to support extended regex on BSD sed, you may need to replace -E with -r based on your system's sed

更新的模式将保存到 file2_updated。需要像这样在 grep 中使用新的模式文件

grep -i -f file2_updated file1

您要查找的标志是-F。来自 man grep:

-F, --fixed-strings

Interpret PATTERN as a list of fixed strings (instead of regular expressions), separated by newlines, any of which is to be matched.

您可以将其与 -f 结合使用:

grep -Ff file2 file1

明确地说,这会将 file2 的每一行都视为与 file1.

的完全匹配