Usando a subfunção awk para numerar seqüencialmente os cabeçalhos fasta

0

Eu sou novo em scripts de shell e estou tentando numerar sequencialmente os cabeçalhos em um arquivo fasta. As seqüências no meu arquivo fasta são assim:

>Rodentia sp. 
MALWILLPLLALLILWGPDPAQAFVNQHLCGSHLVEALYILVCGERGFFYTPMSRREVED
PQVGQVELGAGPGAGSEQTLALEVARQARIVQQCTSGICSLYQENYCN

>Ovis aries
MALWTRLVPLLALLALWAPAPAHAFVNQHLCGSHLVEALYLVCGERGFFYTPKARREVEG
PQVGALELAGGPGAGGLEGPPQKRGIVEQCCAGVCSLYQLENYCN

Eu quero usar awk no meu script de shell para que os cabeçalhos sejam numerados sequencialmente, inserindo um número começando de 1 a n (onde n é o número de sequências) após o ">", para que as sequências pareçam assim:

> 1 Rodentia sp. 
MALWILLPLLALLILWGPDPAQAFVNQHLCGSHLVEALYILVCGERGFFYTPMSRREVED
PQVGQVELGAGPGAGSEQTLALEVARQARIVQQCTSGICSLYQENYCN

> 2 Ovis aries
MALWTRLVPLLALLALWAPAPAHAFVNQHLCGSHLVEALYLVCGERGFFYTPKARREVEG
PQVGALELAGGPGAGGLEGPPQKRGIVEQCCAGVCSLYQLENYCN

Eu tentei usar a subfunção no awk, para fazer isso, substituindo todas as instâncias de ">" com "> [um número]".

awk '/>/{sub(">", "> ++i ")}1' file

No entanto, não entendo como incrementar variáveis usando a subfunção no awk. Eu gostaria de saber se existe uma maneira de fazer isso usando a subfunção. Eu entendo como sub obras, mas eu não sei como declarar a variável a ser incrementada corretamente.

Eu declarei que eu seja 1 no começo do meu script de shell:

i=1

No entanto, a saída que recebo da subfunção é:

> ++$i Rodentia sp. 
> ++$i Ovis aries 

Como pode declarar uma variável corretamente para que eu possa usar a subfunção awk para numerar os cabeçalhos?

    
por ceno980 30.09.2017 / 14:07

2 respostas

0

Você estava próximo, apenas use ++i fora da substring entre aspas "> ++i" to "> " ++i .

awk '/^>/{sub(">", "> "++i " ")}1' infile
    
por 30.09.2017 / 14:14
0

Como o αғsнιη apontou , você está inserindo ++i como parte de uma string literal.

Uma solução alternativa, que pode parecer um pouco mais bonita:

awk -F '>' '/^>/ { $1 = "> " ++i } { print }' file.fa

ou, se você gosta da abreviação de { print } ,

awk -F '>' '/^>/ { $1 = "> " ++i } 1' file.fa

Isso usa > como o delimitador de campo de entrada e substitui o primeiro campo (o bit antes do > , que está vazio na entrada) em qualquer linha de cabeçalho com a string necessária.

    
por 30.09.2017 / 22:19