Файл SAM в FASTA с помощью awk или sed?

Пример sam-файла здесь:

@SQ SN:gi|669687444|gb|KJ769480.1|  LN:1200
@SQ SN:gi|669687442|gb|KJ769479.1|  LN:900
@SQ SN:gi|669687440|gb|KJ769478.1|  LN:1162
@SQ SN:gi|669687438|gb|KJ769477.1|  LN:1074
@SQ SN:gi|669687436|gb|KJ769476.1|  LN:1194
@SQ SN:gi|669687434|gb|KJ769475.1|  LN:1074
@SQ SN:gi|669687432|gb|KJ769474.1|  LN:1194
@SQ SN:gi|669687430|gb|KJ769473.1|  LN:1074
@SQ SN:gi|669687428|gb|KJ769472.1|  LN:1194
@SQ SN:gi|669687426|gb|KJ769471.1|  LN:1189
@SQ SN:gi|669687424|gb|KJ769470.1|  LN:1074
@SQ SN:gi|669687422|gb|KJ769469.1|  LN:370
@PG ID:bwa  PN:bwa  VN:0.7.10-r789  CL:bwa mem /ibers/ernie/home/thh32/Scratch/Hidden_virome/Against_NCBI_viral/Sweetspot/bwa_NCBI_viral_nucl test.fa
Rank10_clean_2213:4:1101:3636:2018  4   *   0   0   *   *   0   0   AAACCATTCGCTTCCTTTAAATCTATCTGTTATTTCCCTTAAATAATTTGAACCATGCGAAGCAATATAAGGATTTAAGACGAAACAATTCTTTTCTCT *   AS:i:0  XS:i:0
Rank10_clean_2213:4:1101:3508:2062  4   *   0   0   *   *   0   0   TCGCTATGCTTACTCCAATGTGGCGTACCAGTGTGCGAAGCTGATGCGCAAACCACGGGAAAAGGAGAAACTCTATCGGTGGATCGTGGATATGGAATTCAAATCCGGTGAGATCCC   *   AS:i:0  XS:i:0
Rank10_clean_2213:4:1101:1470:2237  4   *   0   0   *   *   0   0   GCGGAGCATATCCCCTTGCGTCCTGGACGGCGTGCCCGCATTCATGGGCGGCCACGGCCGCAGCTGCGATGGAATTCATCCCATACACGCTTTCTGAAAGGTTTACGGTCTTGCTCCTGGGATCG   *   AS:i:0  XS:i:0
Rank10_clean_2213:4:1101:1540:2114  4   *   0   0   *   *   0   0   GCGCGCAAGGTCCCGCGGATACTGGTCTGCCATATCTCCAACCCGCCCCTTAAGCGTGATGACGAAATGATCTACCCGAAAAGCTCAGCCGGGTTCCATCCCGGCAACGACGCGCCGCG *   AS:i:0  XS:i:0

Желаемый результат:

>Rank10_clean_2213:4:1101:7988:2027 
GCCATCTCCAACCTCACCACCGGTAGCGGCAACCAGATGAGCTACAACCTCATCGCCATCCTTTGCGGCTTGATCGCCATGGCCGTCACCGCAATCTGCGCTCACTACGGCAAAAAGACCGTCAGCTTAATCCCATTCGTCCTTGGCATGTGCGCCGGTTATGTCGCGGCC
>Rank10_clean_2213:4:1101:6459:2053 
TCACCACTTATTGCATCACCATACACATCAGTTACTGTGATTGTTACTGTGATGTTACCATCGATAGAGGGGTTATAATCTGAACATTCAATGTTTGGTATACTTGTGCTTAACAAAGTAACATCAGATTTCAATGTGTCAATTCTGCTATCCCCTGTTTGAGTATTACTCCCCCAAACCT
CTGTATTCAAGTTACTAATCTTCGGTGTGACATCTCTGCTAATCACACTTGCCACA
>Rank10_clean_2213:4:1101:7962:2142
CGGTCCACCGAGAAAGGATGCTCCCTCAAAGCCTCAGATAGCGAAGGTGGAGACAGGACAAAAGAAGAAACCCCCCCCCCCACCCCCCCCC
>Rank10_clean_2213:4:1101:8018:2112 
GTGAAACGCCTCGCCGACTCTCTCCGCCACCCGGTAATAGCCGTGGGTGTACGGATCAAACGCAATGGCGTCCACAAGAGACATATCGACCTTGTCACCGGCCATGACGCGCTCGTCTGCCGTGACATTGACGACCTTGCCGATGACGCCGAC
>Rank10_clean_2213:4:1101:2807:2211 
TGAAAGTTGACATAGGAACCTGTGGAAGCATTGTAGTTAATGAGCGTTTTTTTTAAGTCATCAAAGTTATTTTTTAAGTTATGACGGCGGATATAATCCTGGAACTTGGGATTGACTATCCATTTATCAAAACACTGATCAAGAACAGTGCTTTGAATAAGCTCAGGTGAAGCATTGACTT
CAAATCCTGGCATAACACCTACAAGATAGCCATATTTCTCAAGTAATGCCT

Я никогда раньше не использовал sed или awk, и меня действительно смущает то, как они работают, поэтому, если бы кто-то мог объяснить, как это сделать, это было бы потрясающе.

Спасибо, Том


person Tom    schedule 21.01.2015    source источник
comment
Каков ваш желаемый результат?   -  person ShellFish    schedule 21.01.2015
comment
Обновлен вопрос, чтобы привести пример вывода жира.   -  person Tom    schedule 21.01.2015
comment
Если SAM и FASTA являются стандартными форматами, то вполне вероятно, что для этого уже есть инструменты. Возможно, стоит взглянуть на BioPerl, в котором может быть что-то полезное.   -  person Tom Fenech    schedule 21.01.2015
comment
Проблема в том, что я хочу выйти из программы, которая создает samfile, но у меня нет места для его хранения, поэтому нужно сразу конвертировать в fasta   -  person Tom    schedule 21.01.2015
comment
Если вы можете четко указать, как одно сопоставляется с другим (форматы кажутся мне совершенно непрозрачными), возможно, это удастся сделать. На данный момент я не вижу, как ваш ввод и вывод соответствуют друг другу (не так ли?).   -  person Tom Fenech    schedule 21.01.2015
comment
Хорошо, информация об использовании из файла sam — это имя каждого элемента, такое как Rank10_clean_2213, а затем в следующей строке сама последовательность AAACCATTCGCTTCCTTTAAATCTATCTGTTATTTCCCTTAAATAATTTGAACCATGCGAAGCAATATAAGGATTTAAGACGAAACAATTCTTTTCTCTCT. Создание вывода в первой строке ›Rank10_clean_2213 и во второй строке AAACCATTCGCTTCCTTTAAATCTATCTGTTATTTCCCTTAAATAATTTGAACCATGCGAAGCAATATAAGGATTTAAGACGAAACAATTCTTTTCTCT   -  person Tom    schedule 21.01.2015
comment
Отредактируйте свой вопрос, чтобы показать минимальный образец ввода и соответствующий вывод в нужном формате.   -  person Tom Fenech    schedule 21.01.2015
comment
Обновлено, чтобы показать результат именно таким, каким он должен быть.   -  person Tom    schedule 21.01.2015
comment
Ваш вывод и ввод получены из разных данных, судя по числам.   -  person ShellFish    schedule 21.01.2015


Ответы (2)


Удалите строки, начинающиеся с @, используя sed d следующим образом: sed '/^@/d' d означает удаление, а часть между косыми чертами — это регулярное выражение для сопоставления (т.е. начало строки ^, за которой следует @). Затем просто отформатируйте другие строки, используя замену следующим образом: sed 's/^\([^ ]*\)[^ATGC]*\([ATGC]*\)[ :*a-zA-Z0-9]*$/>\1\n\2/'. Эта команда вставит новую строку перед последовательностью A, T, G или Cs. И добавляет > перед исходной строкой. Части между \(\) представляют собой захваченные группы, которые можно заменить с помощью \1 или \2 в зависимости от индекса захваченной группы. Команда sed будет искать начало строки, за которой следует несколько не пробелов (т. е. нечетные строки вашего вывода). Затем, начиная со следующего пробела, он будет искать ряд символов, отличных от AGTC, пока не встретится строка AGTC. Мы поймаем эту последовательность в группе (группа 2). После этой последовательности может быть несколько пробелов, буквенных символов и еще много чего ([ :*a-zA-Z0-9]), пока конец строки не будет соответствовать $. Теперь мы берем только первую группу и вторую группу и вставляем между ними новую строку /\1\n\2/.

Все, что вам нужно сделать сейчас, это ввести данные maxscore и т. д. Я не могу найти, откуда вы берете эту информацию.

Скажем, ввод находится в файле с именем sam:

$ sed '/^@/d; s/^\([^ ]*\)[^ATGC]*\([ATGC]*\)[ :*a-zA-Z0-9]*$/>\1\n\2/' sam
>Rank10_clean_2213:4:1101:3636:2018
AAACCATTCGCTTCCTTTAAATCTATCTGTTATTTCCCTTAAATAATTTGAACCATGCGAAGCAATATAAGGATTTAAGACGAAACAATTCTTTTCTCT
>Rank10_clean_2213:4:1101:3508:2062
TCGCTATGCTTACTCCAATGTGGCGTACCAGTGTGCGAAGCTGATGCGCAAACCACGGGAAAAGGAGAAACTCTATCGGTGGATCGTGGATATGGAATTCAAATCCGGTGAGATCCC
>Rank10_clean_2213:4:1101:1470:2237
GCGGAGCATATCCCCTTGCGTCCTGGACGGCGTGCCCGCATTCATGGGCGGCCACGGCCGCAGCTGCGATGGAATTCATCCCATACACGCTTTCTGAAAGGTTTACGGTCTTGCTCCTGGGATCG
>Rank10_clean_2213:4:1101:1540:2114
GCGCGCAAGGTCCCGCGGATACTGGTCTGCCATATCTCCAACCCGCCCCTTAAGCGTGATGACGAAATGATCTACCCGAAAAGCTCAGCCGGGTTCCATCCCGGCAACGACGCGCCGCG
person ShellFish    schedule 21.01.2015
comment
Thanks for this but when I use the code this is the given output: ›Rank10_clean_2213:4:1101:13998:2091 4 * 0 0 * * 0 0 CAGCATTATCTGATGAGAATGTAACCAAGTGGGCTTTCAACGCTTCCTTTGAGCGAATTTGTCTCTCCAACTGGCTGAAGAAACATCGCCCGGAATACTTCACCGGCTACAGCATCCCGGAGGATCCCGCCGGTCAGTACCTGAATCCGGCATCCTGGAAATGTACCATGATCTGGTCAGCCTATATGGGACTGCCGCTCTCTCTGGAAGGTGTCGGAACCGTCC * AS:i:0 XS:i: - person Tom; 21.01.2015
comment
Same error is occuring with : ›Rank10_clean_2213:4:1101:13998:2091 4 * 0 0 * * 0 0 CAGCATTATCTGATGAGAATGTAACCAAGTGGGCTTTCAACGCTTCCTTTGAGCGAATTTGTCTCTCCAACTGGCTGAAGAAACATCGCCCGGAATACTTCACCGGCTACAGCATCCCGGAGGATCCCGCCGGTCAGTACCTGAATCCGGCATCCTGGAAATGTACCATGATCTGGTCAGCCTATATGGGACTGCCGCTCTCTCTGGAAGGTGTCGGAACCGTCC * AS:i:0 XS:i:0 - person Tom; 21.01.2015
comment
Эта строка отсутствует в вашем образце ввода, можете ли вы добавить вредоносную строку? Испытываете ли вы проблемы с предоставленным вводом? Это странно, потому что это работает на моей системе и на вашем вводе... - person ShellFish; 21.01.2015

решение с авк

awk '/^@/{ next; } { print ">"$1; print $10 }' input.sam

Вы получаете

>Rank10_clean_2213:4:1101:3636:2018
AAACCATTCGCTTCCTTTAAATCTATCTGTTATTTCCCTTAAATAATTTGAACCATGCGAAGCAATATAAGGATTTAAGACGAAACAATTCTTTTCTCT
>Rank10_clean_2213:4:1101:3508:2062
TCGCTATGCTTACTCCAATGTGGCGTACCAGTGTGCGAAGCTGATGCGCAAACCACGGGAAAAGGAGAAACTCTATCGGTGGATCGTGGATATGGAATTCAAATCCGGTGAGATCCC
>Rank10_clean_2213:4:1101:1470:2237
GCGGAGCATATCCCCTTGCGTCCTGGACGGCGTGCCCGCATTCATGGGCGGCCACGGCCGCAGCTGCGATGGAATTCATCCCATACACGCTTTCTGAAAGGTTTACGGTCTTGCTCCTGGGATCG
>Rank10_clean_2213:4:1101:1540:2114
GCGCGCAAGGTCCCGCGGATACTGGTCTGCCATATCTCCAACCCGCCCCTTAAGCGTGATGACGAAATGATCTACCCGAAAAGCTCAGCCGGGTTCCATCCCGGCAACGACGCGCCGCG

из документации sam format, если у вас есть флаг 8 во втором столбце, это несопоставленная последовательность, лучше

awk '/^@/{ next; } 
    { if(and(int($2),8)){ 
        next; 
      } 
      print ">"$1; 
      print $10 }' input.sam

or

awk '/^@/{ next; } and(int($2),8){next;} { print ">"$1; print $10 }' input.sam
person Jose Ricardo Bustos M.    schedule 29.05.2015