我有一個如下所示的文件:
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(
。