我有一个如下所示的文件:
gene ID protein
Solyc06g062540 (Z) PYROPHOSPHATASE 3 (PTHR20889:SF0)
Solyc10g075050 ALBUMIN SUPERFAMILY (PTHR33076:SF11)
Solyc07g061760 SUBFAMILY (PTHR24177:SF35)
该文件以制表符分隔;第一列(基因 ID)和第二列(蛋白质名称)之间有一个制表符。(蛋白质名称可以包含空格,但不能包含制表符。)蛋白质名称包含括号中的字符串,例如(PTHR33076:SF11)
;这是蛋白质ID。我想保留第一列并删除第二列中除蛋白质 ID(及其括号)之外的所有内容。因此输出将如下所示:
Solyc06g062540 (PTHR20889:SF0)
Solyc10g075050 (PTHR33076:SF11)
Solyc07g061760 (PTHR24177:SF35)
我该怎么做?我使用“标记”功能标记了括号中的所有 ID,并输入(\w+\d+:\w+\d+)
以突出显示括号中的所有 ID,但我无法对其进行操作。请注意,一些蛋白质名称确实有其他带括号的字符串(例如,参见第一行,其中蛋白质名称包含(Z)
我想要的 ID 值)。我不想保留那些。
答案1
您可以使用正则表达式搜索和替换来执行此操作。按Ctrl+H打开替换对话框。确保搜索模式为Regular Expression
。
找什么:
(^[^\t\r\n]+\t)[^\t\r\n]+(\(\w+\d+:\w+\d+\))[^\t\r\n]*
用。。。来代替:
\1\2
模式解释:
[^\t\r\n]+
是任何不包含制表符、换行符或回车符的字符串。这应该只匹配文件中某一列的文本。
^[^\t\r\n]+
匹配第一列的内容,因为前导^
将匹配限制在行首。
第一个捕获组(^[^\t\r\n]+\t)
匹配第一个字段和后面的选项卡的内容。
[^\t\r\n]+(\(\w+\d+:\w+\d+\))[^\t\r\n]*
匹配第二个字段的内容,并且仅当括号表达式存在时才匹配。
第二个捕获组(\(\w+\d+:\w+\d+\))
与括号表达式匹配。
替换模式\1\2
返回第一个和第二个捕获组。这实际上删除了第二个字段中的周围文本,因为匹配的那部分不包含在捕获组中。
答案2
如果(括号内的)蛋白质 ID 始终是行中的最后一个字符(如您所展示的),则搜索\t.*(
(或可能\t[^\r\n]*(
)并将其替换为就足够了\t(
。