Alterar posição da palavra

0

Eu tenho um arquivo com várias linhas, conforme indicado abaixo, com cabeçalho para cada espécie, começando com '>'

>gi|398852808|ref|NZ_AKJD01000108.1| Pseudomonas sp. GM80 PMI37_contig126.126, whole genome shotgun sequence
CCGCAGGCTGCGATCTTTTGATGTTGTTTTTTTAAGATCAAGATCAAAAGATCGCAGCCTTCGGCAGCTCCTACAGGTGG
TCGTGGGTTTAAGCCGCTCAATCCAGTAAACTGCGGCACGTTTTTCTCTAAGTAGTGTTTTCCCCATGCAAATTGCTCTG
GCGCCCATGGAGGGGTTGGTCGACGACATCCTCCGCGACGTGCTGACCCGCGTTGGCGGCATCGATTGGTGCGTGACTGA
ATTCATTCGGGTCAACGATCAGTTGCTCACCCCGGCTTACTTCCACAAGTTCGGCCCCGAGCTGCTCAACGGTGCCCGCA
CGGCGTCCGGCGTGCCATTGCGTGTGCAATTGCTCGGTTCCGACCCGGTGTGCCTGGCGGAAAACGCTGCACTGGCCTGC

Eu gostaria de encontrar o cabeçalho e alterá-lo para

>NZ_AKJD01000108.1|kraken:taxid|398852808 Pseudomonas sp. A3(2016), complete genome
CGCGATGGTCGTTAACGAAAACGCATGCTTACTGGCTAAACGCGGCGCTCTTGACTCCAT
CGCGAGCAAGCTCGCTCCTACAGAAGAAAGCGGCGCTCTAGTGCGCCTCATCCCAGTTAT
TGCCTACCCCCACCTCGACCAGCAGCGGCACATCCAGTTGCGCGGCCCCGCTCATGTGCA

Sem alterar a estrutura do arquivo.

Eu tentei isso

awk -v repl=">kraken:taxid|$ID|" '{ gsub(/^>/,repl,$0); print $0}' $FILE

Eu consigo mover palavras, mas não consigo remover ou obter o resultado desejado. Também existe uma maneira mais rápida de fazer o tamanho do arquivo é de 230 Gb

    
por sbradbio 05.08.2016 / 02:54

1 resposta

0

Bem, uma maneira seria usar os caracteres | como separadores de campo, por exemplo,

awk -v repl="kraken:taxid" 'BEGIN{FS="|";OFS=FS} /^>/ {$1=">"$4;$3=$2$5;$2=repl;NF-=2}1'

Teste com seus dados como file :

$ awk -v repl="kraken:taxid" 'BEGIN{FS="|";OFS=FS} /^>/ {$1=">"$4;$3=$2$5;$2=repl;NF-=2}1' file
>NZ_AKJD01000108.1|kraken:taxid|398852808 Pseudomonas sp. GM80 PMI37_contig126.126, whole genome shotgun sequence
CCGCAGGCTGCGATCTTTTGATGTTGTTTTTTTAAGATCAAGATCAAAAGATCGCAGCCTTCGGCAGCTCCTACAGGTGG
TCGTGGGTTTAAGCCGCTCAATCCAGTAAACTGCGGCACGTTTTTCTCTAAGTAGTGTTTTCCCCATGCAAATTGCTCTG
GCGCCCATGGAGGGGTTGGTCGACGACATCCTCCGCGACGTGCTGACCCGCGTTGGCGGCATCGATTGGTGCGTGACTGA
ATTCATTCGGGTCAACGATCAGTTGCTCACCCCGGCTTACTTCCACAAGTTCGGCCCCGAGCTGCTCAACGGTGCCCGCA
CGGCGTCCGGCGTGCCATTGCGTGTGCAATTGCTCGGTTCCGACCCGGTGTGCCTGGCGGAAAACGCTGCACTGGCCTGC

Você pode achar que o perl é mais rápido, especialmente para arquivos grandes; uma tradução (provavelmente sobre-literal) seria

perl -F'\|' -ane 'print /^>/ ? join "|", ">".$F[3], "kraken:taxid", $F[1].$F[4] : $_' file

mas provavelmente existe uma maneira mais idiomática de fazer isso.

    
por 05.08.2016 / 03:22

Tags