correspondência de padrões e captura em unix

3

Eu tenho um arquivo como este:

A1-1915435_1_MIMAT0000069_MirBase_miR-16_microRNA_1_22-A1-1915435_1_ENSG00000206737_ENST00000384010_U1_snRNA_73_115
A1-2362643_1_MIMAT0000732_MirBase_miR-378_microRNA_1_21-A1-2362643_1_ENSG00000222328_ENST00000410396_U2_snRNA_168_211

Eu quero uma saída na qual eu tenha a parte da micro-RNA e a guia da parte do ENSG separada. Alguma coisa assim:

miR-16_microRNA ENSG00000206737
miR-378_microRNA    ENSG00000222328

Eu posso escrever um script perl para ele, mas eu acho que deve haver uma solução de linha de comando para isso usando awk, sed perl etc.

    
por user3138373 30.12.2014 / 19:10

4 respostas

1
sed -n 'y/_E/\t\n/;s/\n/E/;s/[^m]*//;s/\(A.\).*E/E/;P'

Isso funciona para mim, dado o seu exemplo ...

miR-16  microRNA        ENSG00000206737
miR-378 microRNA        ENSG00000222328

Se você quiser que o primeiro \t ab convertido de volta para um _ , então você pode adicionar s/\t/_/ antes do P - mas eu acho que parece mais legal assim.

Outra maneira poderia parecer ...

sed 's/RNA[^E]*_/RNA\t/;s/[^m]*//;s/_E.*//'

... ou ...

sed 's/[^mE]*\([mE][^mE_]*\)//;s//\t/3;s/_E.*//'

... que imprimem o que você mostra na saída desejada, como ...

miR-16_microRNA ENSG00000206737
miR-378_microRNA        ENSG00000222328

Em qualquer caso, você pode ter que usar um caractere literal no lugar do escape \t , dependendo da implementação do sed .

    
por 30.12.2014 / 20:43
6
perl -pe 's!.*(miR-\d+_microRNA).*(ENSG\d+).*!$1\t$2!'

explain a bit?

Claro, desculpe:

  • para cada linha (perl -p)
  • substitua regex por $1 tab $2 em que
    • $1 e $2 são backreferences numeradas para capturar grupos (...) . Quase todos os mecanismos de expressão regular modernos suportam isso.
  • sobre a expressão regular:
    • . = qualquer caractere, exceto \n
    • .* = uma sequência de caracteres (ignorados na substituição)
    • \d = digit (o mesmo que [0-9] )
    • \d+ = um ou mais \d

Por favor, veja qualquer tutorial de expressões regulares para uma explicação mais detalhada.

    
por 30.12.2014 / 19:19
3

Usando sed :

sed 's/^.*\(miR-[0-9]*_microRNA\).*\(ENSG[0-9]*\).*$/\t/' <infile
    
por 30.12.2014 / 19:19
2

Usando , supondo que o formato seja confiável:

$ awk -F'_' '{print $5"_"$6, $11}' file
miR-16_microRNA ENSG00000206737
miR-378_microRNA ENSG00000222328
    
por 30.12.2014 / 19:45