Substitua nomes de linha por um conjunto de novos nomes sem perturbar o resto do arquivo

2

Eu tenho um grande arquivo de seqüências de proteínas, onde cada nome de seqüência é identificado usando > e a seqüência correspondente nas seguintes linhas.

Exemplo (ignore aspas):

>YAL003W EFB1 SGDID:S000000003, Chr I from 142174-142253,142620-143160, Genome Release 64-1-1, Verified ORF, "Translation elongation factor 1 beta; stimulates nucleotide exchange to regenerate EF-1 alpha-GTP for the next elongation cycle; part of the EF-1 complex, which facilitates binding of aminoacyl-tRNA to the ribosomal A site"
MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
LDDLQQSIEEDEDHVQSTDIAAMQKL*

Desejo remover a maioria do texto do nome para ficar assim (ignore aspas):

>YAL003W EFB1
MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
FDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
LDDLQQSIEEDEDHVQSTDIAAMQKL*

Os nomes só contam como uma linha enquanto as sequências contam como múltiplas, daí o meu problema. Como posso resolver isso?

    
por Jenez 18.09.2014 / 11:18

2 respostas

1

solução awk

$ awk '/>/ { print $1, $2; next } { print }' aa
>YAL003W EFB1
MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
LDDLQQSIEEDEDHVQSTDIAAMQKL*
  • / > / pesquisa por um > em uma linha
  • próximo; não leia mais nenhum padrão no arquivo awk
por 18.09.2014 / 11:31
1

Aqui estão algumas soluções:

  1. grep . O padrão procura linhas que começam com > seguido por 2 sequências de não espaços ( [^ ]+ [^ ]+ ) ou quaisquer caracteres ( .+ ). O -o causa grep para imprimir apenas a parte correspondente de cada linha:

    $ grep -oP '^(>[^ ]+ [^ ]+|.+)' file.fa 
    >YAL003W EFB1
    MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
    EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
    SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
    LDDLQQSIEEDEDHVQSTDIAAMQKL*
    
  2. awk

    $ awk '{if(/>/){print $1,$2}else{print}}' file.fa 
    >YAL003W EFB1
    MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
    EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
    SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
    LDDLQQSIEEDEDHVQSTDIAAMQKL*
    
  3. GNU sed

    $ sed -r 's/(>[^ ]+ [^ ]+).*//' file.fa 
    >YAL003W EFB1
    MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
    EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
    SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
    LDDLQQSIEEDEDHVQSTDIAAMQKL*
    
  4. Qualquer sed

    $ sed 's/\(>[^ ]* [^ ]*\).*//' file.fa 
    >YAL003W EFB1
    MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
    EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
    SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
    LDDLQQSIEEDEDHVQSTDIAAMQKL*
    
  5. cut

    $ cut -d ' ' -f 1,2 file.fa 
    >YAL003W EFB1
    MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
    EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
    SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
    LDDLQQSIEEDEDHVQSTDIAAMQKL*
    
  6. Perl.

    $ perl -lane 'print "@F[0..1]"' file.fa 
    >YAL003W EFB1
    MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD 
    EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK 
    SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS 
    LDDLQQSIEEDEDHVQSTDIAAMQKL* 
    

    As opções são

    • l : remova as novas linhas à direita de cada linha de entrada e adicione uma nova linha a cada chamada impressa.
    • a : divide cada linha de entrada no espaço em branco na matriz @F .
    • n : leia o arquivo de entrada linha a linha.
    • e : execute este script em cada linha.

    O script em si simplesmente imprime os 1º e 2º campos. No caso das linhas de seqüência, apenas será impresso o único campo disponível, o primeiro. qual é a linha inteira.

por 18.09.2014 / 11:53