O shell não é realmente adequado para esse tipo de análise. Você pode ver em seu próprio código que você leu a totalidade de cada arquivo uma vez para cada dos nomes dos genes lidos no arquivo gene.txt
.
O seguinte comando awk
único faria a mesma coisa mais rápido.
awk -F '>' '
FNR == NR { genes[$1]; next }
/^>/ && $2 in genes { if (out != "") close(out);
out = $2 ".fa"
split(FILENAME, a, "_")
$0 = ">" a[1] "_" $2 }
out != "" { print >>out }' genes.txt *_ref.fasta
Primeiro, lê o arquivo genes.txt
e cria uma matriz associativa chamada genes
com os nomes dos genes como chaves.
Quando chega aos arquivos Fasta (o código assume que todos eles são chamados de XXX_ref.fasta
), quando lemos um cabeçalho Fasta, e o gene no cabeçalho é uma chave na nossa lista genes
, então criamos um nome de arquivo de saída do nome do gene como genename.fa
e reescrevemos o cabeçalho para incluir a parte do nome do arquivo atual antes do sublinhado.
Se o cabeçalho original em XXX_ref.fasta
for
>genename
então isso seria transformado em
>XXX_genename
A última parte do script awk
envia todas as linhas para o arquivo de saída apropriado.
Testar isso com os dados que você forneceu gera três arquivos:
$ ls *.fa
FBgn0070974.fa FBgn0076379.fa FBgn0080937.fa
$ cat FBgn0076379.fa
>CR1_FBgn0076379
ATGCTGCGCACCCTTTTCGCCGTGCGTGGTCAGTGCCAGCAGCTGCTGAGGAGAACATTCACCCCCCATTGCAGTGGCCAACGA