grep字符串与字母和数字的精确匹配
我正在使用grep从文件1中提取与文件2中的字符串匹配的行。文件2中的字符串包含字母和数字。eggrep字符串与字母和数字的精确匹配,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
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
我的文件中的几行1t_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