Как удалить все до и после номера переменной в каждой строке? - PullRequest
0 голосов
/ 05 мая 2020

Мне нужно переименовать все заголовки последовательностей в файле.

Заголовки начинаются в этом формате:

>D915_04184 transcript=D915_04184 gene=D915_04184

После этого они должны содержать только идентификатор последовательности в этом формате :

D915_04184

И мне нужно сделать это для каждой последовательности в файле.

Я пытался использовать sed, например

sed 's/'>D915' 'transcript=' 'gene='/D915/g' file_Name >new_file_name

Но у него не сработало. Я также пробовал делать grep -o, но, похоже, это вообще ничего не дает.

Время от времени мне удается вытащить > с самого начала, но не кажется избавиться от всего остального. 04184 должен оставаться, и этот номер отличается в каждой строке. >D915 согласован.

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Попробуйте следующее:

, если вы хотите сохранить первую часть:

sed -E 's/(>D915_[0-9]+).*/\1/g;s/ >//g' 

() <- используется для запоминания шаблона <code>>D915_[0-9]+ <- Означает строку начиная с D915_, за которым следует любое повторение номера. </p>

Демо:

  $echo " >D915_04184 transcript=D915_04184 gene=D915_04184"  | sed -E 's/(>D915_[0-9]+).*/\1/g;s/ >//g' 
D915_04184
$

Если D915_ также изменится, то

sed 's/transcript.*//g; s/ >//g'

Демо:

$echo " >D915_04184 transcript=D915_04184 gene=D915_04184"  | sed 's/transcript.*//g; s/ >//g' 
D915_04184 
0 голосов
/ 06 мая 2020

Есть несколько способов преобразовать эту строку ввода в вывод, показанный в вашем вопросе. Тот, который вы выберете, может зависеть от вариантов ввода, которые не показаны в предоставленной вами выборочной дате.

Вы можете удалить все в каждой строке до последнего равно:

sed 's/.*=//'

Или вы можете удалить все после первого пробела, а затем удалить первый символ:

sed -e 's/ .*//' -e 's/.//'

Или вы можете захватить содержимое поля «расшифровка» и удалить остальные биты:

sed -e 's/.*transcript=//' -e 's/ .*//'

Я использую множественное обозначение -e для удобства чтения. Вы также можете написать это последнее кратко как:

sed 's/.*transcript=//;s/ .*//'
0 голосов
/ 05 мая 2020

Это должно сработать:

sed -r 's/>//;s/\ .*//g' filename > new_file_name

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

...