Você pode fazer:
f=0
for arg in -e -v
do f=$((f+1))
tr '>\n' '\n>' <infile |
grep "$arg" '>.\{200\}'|
tr '>\n' '\n>' >"./outfile$f"
done
Que irá gravar todas as sequências de 200 caracteres ou mais para outfile1 e todas as mais curtas para outfile2.
Ele traduz todos os >
para \n
ewlines e vice-versa - assim, seu primeiro exemplo acima se torna:
TCONS_00000066 gene=XLOC_000030>CCGCCGGCTGCTGCGCGCACCGACTTGTCACCACCCCAGCACGTCCTCCACGTATACAAG>CGCTACGGTCCACCGCGGCAGCGTCGACGTCCTTGTCCGCAAACATGGTGGTGGCAGCTT>CCTCATCGAGCAGCAGCAACTCATCCTCGAGGGGAAGGGCCCAGAGCTTCTAATCCTACA>CGGCAACAACACTTTATACTTGTGTATAATTTCTCTTCGTTTCTGAGTTCATGGCTATCT>TTGTCTCTCTTATCTTCTCCCTTTTGCTATCTCTATATTTGTGATTGCCATGGAAATACA>
Em seguida, corresponde a (ou não) 200 caracteres do primeiro >
para cada linha de entrada. Para a primeira iteração do loop for
- o que corresponde a linhas com 200 caracteres ou mais - ele inverte a conversão para as linhas que grep
correspondem e grava os resultados para outfile1. A segunda iteração obtém sequências mais curtas e as grava no outfile2.
Você deve observar que essa contagem incluirá as novas linhas que estavam nos dados.
Aqui está outra maneira que não tem esse problema:
sed -n '/^>/!{H;$!d
}; x;s/\n[ACGT]\{20\}/&/4p
' <infile >outfile