У меня есть файл, который выглядит так:
gene ID protein
Solyc06g062540 (Z) PYROPHOSPHATASE 3 (PTHR20889:SF0)
Solyc10g075050 ALBUMIN SUPERFAMILY (PTHR33076:SF11)
Solyc07g061760 SUBFAMILY (PTHR24177:SF35)
Файл разделен табуляцией; между первым столбцом (идентификатор гена) и вторым столбцом (имя белка) есть табуляция. (Имя белка может содержать пробелы, но не табуляции.) Имя белка содержит строку в скобках, например, (PTHR33076:SF11)
; это белокИДЕНТИФИКАТОР. Я хочу сохранить первый столбец и удалить все во втором столбце, кроме идентификатора белка (и его скобок). Таким образом, вывод будет выглядеть так:
Solyc06g062540 (PTHR20889:SF0)
Solyc10g075050 (PTHR33076:SF11)
Solyc07g061760 (PTHR24177:SF35)
Как это сделать? Я отметил все идентификаторы в скобках с помощью функции "mark" и ввода, (\w+\d+:\w+\d+)
чтобы выделить все идентификаторы в скобках, но я не могу этим управлять. В качестве примечания, некоторые из названий белков имеют другие строки в скобках (например, см. первую строку, где имя белка содержит, (Z)
а также значение идентификатора, которое мне нужно). Я не хочу их сохранять.
решение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
Если (в скобках) идентификатор белка всегда является последним в строке (как вы показали), то его будет достаточно для поиска \t.*(
(или, возможно \t[^\r\n]*(
, ) и замены на \t(
.