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

grep字符串与字母和数字的精确匹配,grep,exact-match,Grep,Exact Match,我正在使用grep从文件1中提取与文件2中的字符串匹配的行。文件2中的字符串包含字母和数字。eg MSTRG.18691.1 MSTRG.18801.1 我使用sed为文件2中的所有字符串编写单词边界 file 2 \<MSTRG.18691.1\> \<MSTRG.18801.1\> 我想要完全匹配的线条 MSTRG.18691.1 MSTRG.18801.1 而不是 MSTRG.18691.1.2 MSTRG.18801.1.3 我的文件中的几行1 t_nam

我正在使用grep从文件1中提取与文件2中的字符串匹配的行。文件2中的字符串包含字母和数字。eg

MSTRG.18691.1
MSTRG.18801.1
我使用
sed
为文件2中的所有字符串编写单词边界

file 2
\<MSTRG.18691.1\>
\<MSTRG.18801.1\>
我想要完全匹配的线条

MSTRG.18691.1
MSTRG.18801.1
而不是

MSTRG.18691.1.2
MSTRG.18801.1.3
我的文件中的几行1
t_name gene_name FPKM TPM
MSTRG.25.1。0 0
rna71519。93.398872194.727926057583
gene34024 ND1 2971.72876 6195.77694943117
MSTRG.28.1。0 0
MSTRG.28.2。0 0

rna71520。33.235409 69.2927240732149更新答案

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

示例模式:

file1

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的普通文件,并将上述内容粘贴到其中

文件2(模式文件)

只需创建一个名为file2的普通文件,并将上述内容粘贴到其中

从命令行运行以下命令

grep -i --color -f file2 file1
结果:

MSTRG.18801.1
Sed将更改添加到模式文件中

下面是
sed命令
,用于退出
,并将
^
$
添加到您已有的模式文件的开头和结尾

sed -Ee 's/\./\\./g' -e 's/^/\^/g' -e 's/$/\$/g' file2 > file2_updated
-为了支持BSD sed上的扩展正则表达式,您可能需要根据系统的sed将-E替换为-r

更新的模式将保存到文件2\u Updated。需要像这样使用grep中的新模式文件

grep -i -f file2_updated file1

您要查找的标志是
-F
。从
man grep

-F、 --固定字符串

将模式解释为固定字符串(而不是正则表达式)的列表,由新行分隔,其中任何一个都要匹配

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

grep -Ff file2 file1

要明确的是,这将把
file2
的每一行都视为与
file1

完全匹配。文件2中也有类似
MSTRG.13.1
的字符串,但grep返回的
MSTRG.1311.1
不在file2中。请检查更新的答案。点(.)对正则表达式有特殊的意义,我们需要将其转义为不匹配任何单个字符。我使用了
sed的/^/^/'文件2;sed的/$/$/';sed的/\/\./'
使这个
^MSTRG\.18691\.1$
模式。但是整个文件都用
\.
重新计算。如何在点之前添加反斜杠?为什么需要sed?您可以使用普通grep来匹配单词或行。尽管如此,如果您需要使用sed进行一些中间流转换,您可以这样做,然后您可以grep来匹配模式。您只需要在模式文件中使用反斜杠。我在linux中处于非常初级的水平。我不知道如何创建模式文件
^MSTRG\.18801\.1$
,以便与
grep-f
一起使用。我知道使用
sed
在行的开头添加
^
,在行的末尾添加
$
。我不知道如何在模式文件(即文件2)的点之前添加反斜杠@KousalyaDevi什么?我使用了
grep-Ff文件2文件1
它适用于
MSTRG.13.1
(输出中没有MSTRG.1311.1),但是
file2
MSTRG.11443.1
,但输出有
MSTRG.11443.10
MSTRG.11443.13
。我用这个文件没有单词boundaries@KousalyaDevi如果仍将单词边界添加到file2中,则此操作将无效。file1是一个以制表符分隔的文件,有3列。其中,第二列中的一些条目是
我在第一列中使用的
grep
sed -Ee 's/\./\\./g' -e 's/^/\^/g' -e 's/$/\$/g' file2 > file2_updated
grep -i -f file2_updated file1
grep -Ff file2 file1