Eu tenho o seguinte código para você; abaixo dela há uma explicação de como funciona.
Primeiro, vá para o diretório de trabalho ( cd /User/MyData/
) para executar este programa:
awk '
FNR==1 { sample = FILENAME ; sub(/\.fasta/, "", sample }
/^>/ { target = substr($0,2)".fasta" ; next }
{ print ">" sample > target ; print > target }
' Sample_*.fasta
O programa awk
itera sobre todos os arquivos Sample_*.fasta
. No início de cada arquivo de entrada ( FNR==1
), ele extrai o nome da amostra do nome do arquivo atual removendo o sufixo ".fasta". Se uma linha começar com >
, o nome de arquivo de destino desse registro será retirado após o caractere >
e o sufixo do nome de arquivo ".fasta" será anexado. Para o outro tipo de linhas, o nome da amostra extraído anteriormente é gravado no arquivo de destino e, em uma segunda linha, os dados atuais são gravados.
Nota: Se você observar problemas com "muitos descritores de arquivos abertos", a melhor opção é mudar para o GNU awk
, se possível!
Se o GNU awk
não for ou não puder ser disponibilizado na sua plataforma, você precisará de algumas alterações adicionais; a chave é fechar cada arquivo depois de gravar nele, usando a função close()
, com a conseqüência de que você tenha que anexar aos arquivos fechados. (Isso é mais complexo e também menos produtivo, então vale a pena pensar em obter o GNU awk
e usar a primeira variante.)
Essas alterações resultariam em um programa como:
# because of the append operation you need to empty the file targets
# before calling subsequent awk code, e.g. by: rm -f AT???????.fasta
awk '
FNR==1 { sample = FILENAME ; sub(/\.fasta/, "", sample }
/^>/ { target = substr($0,2)".fasta" ; next }
{ printf ">%s\n%s\n", sample, %0 >> target ; close(target) }
' Sample_*.fasta
Observe que, antes de chamar o programa awk
, é necessário remover ou esvaziar quaisquer arquivos de saída existentes de chamadas anteriores (caso contrário, sua nova saída seria anexada aos dados existentes anteriormente nos respectivos arquivos de saída ).