Eu tenho um arquivo de texto com o seguinte formato:
>1
AGGGTCACGTAATGCTGATCCAGTCTTGTTTTTATTTTCATTCATGTTCCCGCTCTTGCT
TTGATTCCGACTTCTAACGTTTAACCTGTGATCAGACGTTTCACTGCTCCATATTTTACG
TGTGCCTGCCGGTCATCTTGGGTAGAGTTAGCATATCC
>2
GTTTGGAAAACCTTGAGAACTTGGCTGAGCAACTAGGAGATAGGCGTATAAAGACTATCG
GCTTTGTTCTCGAAAAAATTCAATCAATTTTCGAGCATTCTTATCGCAGAATTGTTGAAT
>3
ACTCATG
Onde o número real de linhas após cada ">" pode ter milhares ou até milhões. Neste exemplo, digamos (eu não as contei) que existem 180 letras (e 3 linhas) após >1, 2 linhas e 100 caracteres após >2, e 1 linha de 7 caracteres após >3.
Eu gostaria que a saída fosse algo como:
>1
3 180
>2
2 100
>3
1 7
(o formato não é crítico desde que haja duas informações - o número de linhas e o número de caracteres).
Tenho usado um script python para dividir esses arquivos pelo ">" e depois contar o número de linhas e caracteres entre cada >. No entanto, os arquivos são muito grandes e o script python demora muito para ser executado. Existe uma maneira simples de fazer isso usando o awk ou algo mais na linha de comando do Linux?
doit()
imprime os resultados. (e redefinex
ey
)/^>
quando uma linha começa com>
update s (NOTA: este valor nunca é usado!?)x
e incrementey
.teste:
Uma
awk
ideia:Isso gera:
Aqui está outra
awk
ideia que lida com sequências vazias, linhas vazias e comentários em arquivos FASTA:Esta não é de longe uma resposta completa, mas usando
grep -n
você pode mostrar o número da linha onde o>
caractere aparece.A partir daí, você pode começar a usar
awk
para realizar cálculos sobre esses números:...
Usando qualquer awk:
O texto acima pressupõe que você deseja que novas linhas sejam incluídas na contagem; caso contrário, é um ajuste trivial, esperançosamente óbvio, não contá-las.