Как изменить шаблон с символами в начале строки - PullRequest
0 голосов
/ 17 января 2019

У меня есть файл данных, который выглядит следующим образом:

Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "g361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "g361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "g362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "g362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]

Я хотел бы дополнить текст в transcript_id первыми примерно 10-ю символами в строке (данный файл может иметь> 1000 узлов, поэтому мне нужно, чтобы он захватил весь номер узла - но хорошо, если он захватывает некоторые слова "длина"). Итак, для первого набора данных выше я бы хотел прочитать:

Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_g361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "Node_4_g361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "Node_5_g362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "Node_5_g362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]

Я пробовал:

sed 's/transcript_id "/transcript_id "SOMETHING/'  

но не могу понять, что поместить во вторую часть sed, чтобы дополнить первую часть узлом _ #### из той же строки.

1 Ответ

0 голосов
/ 17 января 2019

Если первое слово в строке всегда заканчивается на _length, эта команда sed должна сделать это:

sed 's/^\(.*_\)length .* transcript_id "/&\1/' test.txt

Выход:

Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_g361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "Node_4_g361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "Node_5_g362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "Node_5_g362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]

Попробуйте, если вы не уверены в суффиксе _length:

sed 's/^\(.\{10\}\).*transcript_id "/&\1/'

Выход:

Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_leng361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "Node_4_leng361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "Node_5_leng362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "Node_5_leng362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]

Объяснение

В обоих случаях вы видите этот шаблон замены:

&\1

& захватывает весь матч, то есть все от начала строки (^) до вводной цитаты ("). Со второй строкой вашего примера ввода это будет:

Node_4_length augustus gene 1543 2252 . transcript_id "

\1 захватывает первый подшаблон захвата, то есть все между \( и \). В моей первой команде sed это будет:

Node_4_

Это делает полную строку замены:

Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_

Все, что первоначально следовало за открывающей цитатой, не затрагивается, потому что оно не соответствует шаблону. Это дает полный вывод:

Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_g361.t1";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...