como remover caracteres de nova linha na sequência fasta

0

Eu tenho o arquivo fasta ( modelfasta.fasta ) assim:

>seq1
AAAAAAAAAAAAAAA
GGGGGGGGGGG
>seq2
TTTTTTTTTTTTTTT
CCCCCCC

Estou esperando uma saída assim:

>header>seq1
AAAAAAAAAAAAAAAGGGGGGGGGGG
>header>seq2
TTTTTTTTTTTTTTTCCCCCCC

Eu tentei com o comando sed e awk com o arquivo de exemplo fasta (modelfasta.fasta), mas obtendo a saída dessa maneira

awk '{printf $0""}' modelfasta.fasta 

>seq1AAAAAAAAAAAAAAAGGGGGGGGGGG>seq2TTTTTTTTTTTTTTTCCCCCCC

remove também a nova linha logo após o cabeçalho e mescla as sequências com o cabeçalho

o mesmo resultado encontrado com o sed

sed ':a;N;$!ba;s/\n//g' modelfasta.fasta

>seq1AAAAAAAAAAAAAAAGGGGGGGGGGG>seq2TTTTTTTTTTTTTTTCCCCCCC

Eu quero todas as novas linhas removidas, exceto a do header, por favor ajude

    
por a.k 04.01.2017 / 10:42

1 resposta

1

Você deseja remover todas as novas linhas das linhas que não iniciam com o caractere de cabeçalho fasta > .

awk '/^[>;]/ { if (seq) { print seq }; seq=""; print } /^[^>;]/ { seq = seq $0 } END { print seq }' data.fa

O script Awk é

/^[>;]/    { if (seq) { print seq }; seq=""; print }
/^[^>;]/ { seq = seq $0 }
END     { print seq }

... que fará três coisas diferentes dependendo do que encontrar no arquivo.

  • Uma linha de cabeçalho fasta (linha começando com > ) ou uma linha de comentário rápido (linha começando com ; ): Imprime qualquer sequência que tenhamos lembrado em seq se houver alguma (isso pertence ao cabeçalho anterior). Limpe a sequência lembrada. Imprima a linha atual (o cabeçalho ou o comentário).
  • Uma linha fasta sem cabeçalho (e sem comentário): concatene a sequência lembrada com a sequência na linha. Isso removerá efetivamente as novas linhas.
  • O final do arquivo: imprima a sequência. Esta é a sequência associada ao último cabeçalho no arquivo.

Se você quiser fazer uma impressão bonita da sequência, por exemplo, limitar a 60 caracteres por linha:

#!/usr/bin/awk -f

function pretty(s) {
  p = "";
  n = 1;

  while (n < length(s)) {
    p = (p ? p "\n" : "") substr(s, n, 60);
    n += 60;
  }

  return p;
}

/^[>;]/  { if (seq) { print pretty(seq) }; seq=""; print }
/^[^>;]/ { seq = seq $0 } 
END      { print pretty(seq) }

Coloque isso em prettyfasta.awk e torne-o executável ( chmod +x prettyfasta.awk ) e, em seguida, execute-o:

$ ./prettyfasta.awk data.fa
    
por 04.01.2017 / 11:07