Adicionando caracteres consecutivos para duplicar palavras de acordo com a ordem em que aparecem

2

Então eu tenho arquivos como este, mas para centenas de genes diferentes por arquivo.

>lcl|accession_cds_proteinaccession [gene=dnaA] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC
TTTTAATGCAAATTGGTTAAATCAACAATATGCTGAAATTATCCAAGCAATCTTATTTGATGTTGTAGGC

Existem muitos nomes de genes duplicados de tal forma que o gene = dnaA pode aparecer algumas vezes ao longo do arquivo. Eu preciso que seja assim que se o nome do gene é repetido é adiciona um 2 ao final do nome. Então, para a segunda duplicata em um arquivo, ela muda [gene = dnaA] para [gene = dnaA2] e para a terceira repetição [gene = dnaA3]. Se isso importa, eu sei que não há nenhum nome de gene duplicado mais de 6 vezes. Um exemplo de saída seria parecido com

lcl|accession_cds_proteinaccession [gene=dnaA] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC

lcl|accession_cds_proteinaccession [gene=dnaA2] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC

lcl|accession_cds_proteinaccession [gene=dnaA3] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC
TTTTAATGCAAATTGGTTAAATCAACAATATGCTGAAATTATCCAAGCAATCTTATTTGATGTTGTAGGC

Eu vi respostas aqui que usam o awk para adicionar caracteres ao final das linhas contendo palavras duplicadas ( Eu quero encontrar duplicatas em um arquivo e adicionar um caractere para o final da linha no 1º jogo ). Mas eu preciso adicionar caracteres ao final das palavras que são duplicadas com os caracteres denotando o número de vezes que foram duplicados.

Mesmo que você possa me apontar na direção certa, seria uma grande ajuda!

Obrigado

    
por Talon 20.05.2015 / 01:29

1 resposta

3

One-liner Perl:

perl -pe's/\[gene=([^\]]*)\K\]/$h{$1}++?"$h{$1}]":"]"/e' yourfile

Explicado:

  • -p : executa o código para cada linha do arquivo (armazenada em $_ ) e imprime $_ no final.
  • -e : code.
  • s/regex/replacement/e : combine regex e substitua por substituição em $_ .

O regex:

/\[gene=    # match [gene= 
 ([^\]]*)   # match anything but "]" and put it a matching group
 \K         # don't “take” anything until here
 \]         # match a literal ]
/x

A substituição:

  • condition ? yes : no : operador ternário clássico (leia um if com retorno)
  • $h{$1}++ : armazena o conteúdo do primeiro grupo correspondente em um hash (dictonary, mapping…) e aumenta o valor em um. Retorna 0 , o que é falso no primeiro encontro.

  • "$h{$1}]" : leia o valor de $1 e interpole-o em uma string.

Se você quiser a substituição no arquivo, adicione um -i após o perl . Você pode fornecer um arquivo opcional que termina para um arquivo de backup no sinalizador -i (por exemplo perl -i'.bak' -pe'…' yourfile changes yourfile e cria um yourfile.bak antes da substituição.

    
por 20.05.2015 / 02:04