Como usar expressões regulares e sed para encontrar o padrão e remover os últimos caracteres?

1

Eu tenho um arquivo gff no qual eu preciso remover -R * de todas as linhas que possuem o padrão Parent = gopAga1 _...- R.;

A estrutura do arquivo é mostrada abaixo para um único gene, mas eu preciso de uma correção global para todos os genes no arquivo.

>2446   17292   .   +   .   ID=gopAga1_00004497-RA;Parent=gopAga1_00004497;Name=gopAga1_00004497-RA;Alias=augustus_masked-scaffold4362-processed-gene-0.0-mRNA-1;_AED=0.12;_QI=0|0.8|0.81|1|1|1|11|1368|404;_eAED=0.12;Note=Similar to PLAT: Tissue-type plasminogen activator (Pongo abelii);

>scaffold4362   maker   exon    2446    2545    .   +   .   ID=gopAga1_00004497-RA:exon:4045;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    6721    6834    .   +   .   ID=gopAga1_00004497-RA:exon:4046;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    7241    7415    .   +   .   ID=gopAga1_00004497-RA:exon:4047;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    10114   10205   .   +   .   ID=gopAga1_00004497-RA:exon:4048;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    10478   10649   .   +   .   ID=gopAga1_00004497-RA:exon:4049;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    11037   11122   .   +   .   ID=gopAga1_00004497-RA:exon:4050;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    11518   11713   .   +   .   ID=gopAga1_00004497-RA:exon:4051;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    12794   12930   .   +   .   ID=gopAga1_00004497-RA:exon:4052;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    13006   13146   .   +   .   ID=gopAga1_00004497-RA:exon:4053;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    14920   15047   .   +   .   ID=gopAga1_00004497-RA:exon:4054;Parent=gopAga1_00004497-RA;

>scaffold4362   maker   exon    16051   17292   .   +   .   ID=gopAga1_00004497-RA:exon:4055;Parent=gopAga1_00004497-RA;

Estou usando sed para encontrar padrões, mas não tenho certeza de como usar o sed para remover tudo entre o último número da linha e o ponto e vírgula.

O meu script atual funciona? A saída esperada está abaixo.

sed / Parent = gopAga1 _ ........ R; $ / Parent = gopAga1 ........; / gop.gff

>2446   17292   .   +   .   ID=gopAga1_00004497-RA;Parent=gopAga1_00004497;Name=gopAga1_00004497-RA;Alias=augustus_masked-scaffold4362-processed-gene-0.0-mRNA-1;_AED=0.12;_QI=0|0.8|0.81|1|1|1|11|1368|404;_eAED=0.12;Note=Similar to PLAT: Tissue-type plasminogen activator (Pongo abelii);

>scaffold4362   maker   exon    2446    2545    .   +   .   ID=gopAga1_00004497-RA:exon:4045;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    6721    6834    .   +   .   ID=gopAga1_00004497-RA:exon:4046;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    7241    7415    .   +   .   ID=gopAga1_00004497-RA:exon:4047;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    10114   10205   .   +   .   ID=gopAga1_00004497-RA:exon:4048;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    10478   10649   .   +   .   ID=gopAga1_00004497-RA:exon:4049;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    11037   11122   .   +   .   ID=gopAga1_00004497-RA:exon:4050;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    11518   11713   .   +   .   ID=gopAga1_00004497-RA:exon:4051;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    12794   12930   .   +   .   ID=gopAga1_00004497-RA:exon:4052;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    13006   13146   .   +   .   ID=gopAga1_00004497-RA:exon:4053;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    14920   15047   .   +   .   ID=gopAga1_00004497-RA:exon:4054;Parent=gopAga1_00004497;

>scaffold4362   maker   exon    16051   17292   .   +   .   ID=gopAga1_00004497-RA:exon:4055;Parent=gopAga1_00004497;
por fargo 23.08.2018 / 17:45

3 respostas

4

Talvez:

sed 's/-R[^;]*;$/;/'

Ou

awk -F ';' -f OFS=';' '{sub(/-R.*/, "",$(NF-1))}; 1'
    
por 23.08.2018 / 17:51
1
$ sed '/^>.*Parent=samp1_/s/-R.;$/;/' <file.fa
>ID=samp1_00004497:4045;Parent=samp1_00004497;
>ID=samp1_00004497:4046;Parent=samp1_00004498;
>ID=samp1_00004497:4047;Parent=samp1_00004499;
>ID=samp1_00004497:4048;Parent=samp1_00004496;

O comando sed acima encontrará todas as linhas começando com > e contendo a string Parent=samp1_ , e para cada linha substituirá a% final-R.; (onde . corresponde a um único caractere) com apenas %código%. As linhas que não terminam com nada que corresponda a ; permanecerão inalteradas.

Altere o ponto em -R.; para -R.; se você quiser remover qualquer número de caracteres que não sejam [^;]* até o ; no final.

Para sua pergunta atualizada, use ; no lugar de Parent=gopAga1_ .

    
por 23.08.2018 / 17:53
1

A linha de comando

sed -re 's/([^-]+).+?;/;/g'

emitirá tudo até - para cada linha, não incluindo - e, em seguida, adicionará um ponto e vírgula ao final.

Atualizar

sed -re 's/(_.{8})-R.//g'

removerá caracteres indesejados com base na presença de _ , em seguida, 8 caracteres e, em seguida, -R .

    
por 23.08.2018 / 17:56