Este é o seu script awk
:
/^>/ {
print s ? s "\n" $0 : $0;
s = "";
next;
}
{
s = s sprintf("%s", $0);
}
END {
if (s)
print s;
}
O primeiro bloco é acionado apenas para linhas que começam com >
, ou seja, linhas de cabeçalho fasta.
No primeiro bloco, algo é impresso. Esse algo é s ? s "\n" $0 : $0
. Isso significa que "se s
for diferente de zero (ou não definida), use s
e adicione uma nova linha a ela seguida por toda a linha atual, caso contrário, use apenas toda a linha atual". Neste programa, s
será uma sequência parcialmente lida pertencente à linha de cabeçalho processada mais recentemente, e quando o programa atingir uma linha de cabeçalho, essa instrução print
exibirá a última sequência (que agora está completa), se houver foi qualquer, seguido pela linha de cabeçalho recém-encontrada em uma nova linha.
O bloco então define s
para uma string vazia (ainda não lemos nenhuma sequência pertencente a este cabeçalho), e passamos para a próxima linha de entrada.
O próximo bloco é executado para todas as linhas de entrada (mas não para linhas de cabeçalho, pois elas serão ignoradas devido ao next
no bloco anterior). Ele simplesmente anexa a linha atual a s
. sprintf
é usado, mas não sei bem por que ( s = s $0
provavelmente funcionaria também).
O último bloco será executado depois de ler todas as linhas de entrada. Ele imprimirá a seqüência que pertence à última linha de cabeçalho, se houver alguma.
Resumo:
O script awk
concatena todas as linhas de sequência separadas, salvando-as em uma variável. Quando uma linha de cabeçalho é encontrada, ela exibe a sequência lida até o momento junto com o novo cabeçalho em uma linha própria. No final, a sequência pertencente ao último cabeçalho é exibida.
Script alternativo awk
que não armazena sequência em uma variável (pode ser útil se você tiver genomas muito grandes em seus arquivos fasta):
/^>/ {
if (NR == 1) {
print; # 1st header line, just print it.
} else {
# Print a newline for the prev. sequence, then the header line on its own line.
printf("\n%s\n", $0);
}
next; # Skip to next input line.
}
{
printf("%s", $0); # Print sequence without newline.
}
END {
printf("\n"); # Add final newline to output.
}
Como "one-liner":
awk '/^>/{if(NR==1){print}else{printf("\n%s\n",$0)}next} {printf("%s",$0)} END{printf("\n")}' sequence.fasta