Extraia parte das linhas com um padrão específico e armazene em um novo campo usando awk ou sed

0

Meu problema é semelhante a este , mas a parte que quero extrair está dentro da linha e também quero armazená-la em uma coluna recém-criada no arquivo original em vez de na saída.

Uma linha no meu arquivo delimitado por tabulação se parece com:

chr1    25228613        25229157        CDS     HAVANA  .       -       2       ID=CDS:ENST00000338888.3;Parent=ENST00000338888.3;gene_id=ENSG00000020633.18_3;transcript_id=ENST00000338888.3_2;gene_type=protein_coding;gene_name=RUNX3;transcript_type=protein_coding;transcript_name=RUNX3-202;exon_number=7;exon_id=ENSE00001384103.2;level=2;protein_id=ENSP00000343477.3;transcript_support_level=1;tag=basic,appris_alternative_2,CCDS;ccdsid=CCDS30633.1;havana_gene=OTTHUMG00000003316.1_3;havana_transcript=OTTHUMT00000009285.1_2;remap_original_location=chr1:-:24902122-24902666;remap_status=full_contig

Eu quero extrair o conteúdo por trás de "gene_name" em $ 9, esta linha é RUNX3.

A saída esperada:

chr1    25228613        25229157        CDS     HAVANA  .       -       2       ID=CDS:ENST00000338888.3;Parent=ENST00000338888.3;gene_id=ENSG00000020633.18_3;transcript_id=ENST00000338888.3_2;gene_type=protein_coding;gene_name=RUNX3;transcript_type=protein_coding;transcript_name=RUNX3-202;exon_number=7;exon_id=ENSE00001384103.2;level=2;protein_id=ENSP00000343477.3;transcript_support_level=1;tag=basic,appris_alternative_2,CCDS;ccdsid=CCDS30633.1;havana_gene=OTTHUMG00000003316.1_3;havana_transcript=OTTHUMT00000009285.1_2;remap_original_location=chr1:-:24902122-24902666;remap_status=full_contig    RUNX3

Como fazer isso usando o awk ou o sed?

    
por MagicPants 01.01.2018 / 08:15

3 respostas

2

Como você conhece os delimitadores, basta dividi-los e remontá-los

sed -Ei 's/(.*gene_name=)([^;]*)(;.*)/\t/g' gene

que se divide em

(.*gene_name=)

toda a sua string até a tag gen_name vai para a variável 1

([^;]*)

todos os caracteres contínuos até o; vá para a variável 2

(;.*)

o resto da sua string vai para a variável 3

\t

recomponha sua string com uma guia e o gene anexado

EDITAR

ou como notas @Weijun

sed -Ei 's/.*gene_name=([^;]*).*/
sed -Ei 's/(.*gene_name=)([^;]*)(;.*)/\t/g' gene
\t/g' gene
\t

Outro EDIT

Code de golfe

(.*gene_name=)
    
por 01.01.2018 / 08:57
1

com gawk :

gawk 'match($9,/^.*gene_name=([^;]*);.*/,arr) {print $0"\t"arr[1]}'

Isso acrescenta gene_name ao final de cada linha que contém a string "gene_name=". Você pode ajustá-lo para suas necessidades.

    
por 01.01.2018 / 08:59
0

Seguir awk também pode ajudá-lo no mesmo.

awk '{val=$0;sub(/.*gene_name=/,"",val);sub(/\;.*/,"",val);print $0,val}' Input_file
    
por 01.01.2018 / 10:36