Заменить заголовки мультифаст-файла awk - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь изменить заголовки из мультифаст-файла, используя awk.

Мой файл выглядит следующим образом:

>NS500106:288:HGHTHAFXY:1:11101:16650:2011:CTATAC;size=206083;
GTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG
>NS500106:288:HGHTHAFXY:1:11101:1149:1903:CTATAC;size=19175;
CAGCGAGAGCGAGACGCAGCCGGTGAACCGCGTGGCGTACAACGTCGGCGGGCAGATGGCCACCAACAACCAGAGCTCCA
CCACTGCCCCCGCGACCGGCACGTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG

Я использую эту команду:

awk '/[^;]*/{print "Variant_" ++i; next} {print}' < input.fasta > output.fasta

Где, /[^;]*/ сопоставляет строки до первого вхождения точки с запятой и заменяет совпадающую часть заголовка на Variant_1, Variant_2 и т. Д.

Приведенная выше команда изменяет весь заголовок на Variant_1 ии так далее, а также не печатает строки последовательности.

Как мне решить эту проблему?

Мой желаемый вывод такой, как показано ниже:

Variant_1;size=206083;
GTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG
Variant_2;size=19175;
CAGCGAGAGCGAGACGCAGCCGGTGAACCGCGTGGCGTACAACGTCGGCGGGCAGATGGCCACCAACAACCAGAGCTCCA
CCACTGCCCCCGCGACCGGCACGTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вы можете попробовать с:

>> awk '/>.*/{sub(/[^;]*/,"Variant_" ++i )}1' < input.fasta  

Variant_1;size=206083;
GTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG
Variant_2;size=19175;
CAGCGAGAGCGAGACGCAGCCGGTGAACCGCGTGGCGTACAACGTCGGCGGGCAGATGGCCACCAACAACCAGAGCTCCA
CCACTGCCCCCGCGACCGGCACGTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG

То, что вы пытались удалить всю строку, в этом случае sub решает эту проблему

0 голосов
/ 06 декабря 2018

Проверьте этот лайнер Perl-one

$ cat callie.txt
>NS500106:288:HGHTHAFXY:1:11101:16650:2011:CTATAC;size=206083;
GTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG
>NS500106:288:HGHTHAFXY:1:11101:1149:1903:CTATAC;size=19175;
CAGCGAGAGCGAGACGCAGCCGGTGAACCGCGTGGCGTACAACGTCGGCGGGCAGATGGCCACCAACAACCAGAGCTCCA
CCACTGCCCCCGCGACCGGCACGTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG

$ perl -ne ' BEGIN {$x=1} { s/(.*?);/"Variant_${x};"/e and $x++ ; print }' callie.txt
Variant_1;size=206083;
GTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG
Variant_2;size=19175;
CAGCGAGAGCGAGACGCAGCCGGTGAACCGCGTGGCGTACAACGTCGGCGGGCAGATGGCCACCAACAACCAGAGCTCCA
CCACTGCCCCCGCGACCGGCACGTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG

$

Еще короче

$ perl -pe ' { s/(.*?);/sprintf("Variant_%d;",++$x)/e; }' callie.txt
Variant_1;size=206083;
GTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG
Variant_2;size=19175;
CAGCGAGAGCGAGACGCAGCCGGTGAACCGCGTGGCGTACAACGTCGGCGGGCAGATGGCCACCAACAACCAGAGCTCCA
CCACTGCCCCCGCGACCGGCACGTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG

$
0 голосов
/ 06 декабря 2018

Где, / [^;] * / сопоставляет строки до первого вхождения точки с запятой и заменяет совпадающую часть заголовка на Variant_1, Variant_2 и т. Д.

Нет, это неправильно.Он отображает строки, содержащие ноль или более символов, не являющихся точкой с запятой (например, все строки), и печатает Variant_n, где n - номер строки.{print} часть никогда не достигается.

Вот мой подход:

$ awk 'BEGIN{FS=OFS=";"}NF>1{$1="Variant_"++i}1' file
Variant_1;size=206083;
GTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG
Variant_2;size=19175;
CAGCGAGAGCGAGACGCAGCCGGTGAACCGCGTGGCGTACAACGTCGGCGGGCAGATGGCCACCAACAACCAGAGCTCCA
CCACTGCCCCCGCGACCGGCACGTACAACCTCCAGGAAATCGTGCCCGGCAGCGTGTGGATGGAGAGGGACGTG
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...