extrair uma parte da string de uma coluna particular

0

Eu tenho o seguinte arquivo como entrada:

chr1    HAVANA  exon    11869   12227   .   +   .   gene_id "ENSG00000223972.5_2"; transcript_id "ENST00000456328.2_1"; gene_type "transcribed_unprocessed_pseudogene"; gene_name "DDX11L1"; transcript_type "processed_transcript"; transcript_name "DDX11L1-002"; exon_number 1; exon_id "ENSE00002234944.1_1"; level 2; transcript_support_level 1; tag "basic"; havana_gene "OTTHUMG00000000961.2_2"; havana_transcript "OTTHUMT00000362751.1_1"; remap_original_location "chr1:+:11869-12227"; remap_status "full_contig";
chr1    HAVANA  exon    12010   12057   .   +   .   gene_id "ENSG00000223972.5_2"; transcript_id "ENST00000450305.2_1"; gene_type "transcribed_unprocessed_pseudogene"; gene_name "DDX11L1"; transcript_type "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-001"; exon_number 1; exon_id "ENSE00001948541.1_1"; level 2; transcript_support_level "NA"; ont "PGO:0000005"; ont "PGO:0000019"; tag "basic"; havana_gene "OTTHUMG00000000961.2_2"; havana_transcript "OTTHUMT00000002844.2_1"; remap_original_location "chr1:+:12010-12057"; remap_status "full_contig";

Este é um arquivo de 9 colunas separado por guias.

Eu quero imprimir a coluna 1,4,5,7 e da coluna 9 a parte do gene_name de forma que a saída seja

chr1    11869   12227   +   DDX11L1
chr1    12010   12057   +   DDX11L1

Eu pensei em usar a combinação awk e sed, mas não consigo o que quero

awk -v OFS="\t" -F "\t" '{print $1,$4,$5,$7,$9}' | sed 's/gene_name\s"\(.+\)";\stran*//'

Qualquer ajuda seria apreciada.

Obrigado

    
por user3138373 07.08.2017 / 18:42

3 respostas

3

Se você tem o GNU awk, você pode usar gensub para fazer a substituição usando um regex adequado, por ex. assumindo que tudo a partir de gene_id é um único campo delimitado por tabulação 9:

gawk -F '\t' '{$9 = gensub(/.*gene_name "([^"]*)".*/,"\1","1",$9); print $1,$4,$5,$7,$9}' input
chr1 11869 12227 + DDX11L1
chr1 12010 12057 + DDX11L1
    
por 07.08.2017 / 18:54
2

Use awk com vários separadores.

 awk -F"[\" \t]" '{print $1,$11,$14,$20,$40}' infile.txt 
    
por 07.08.2017 / 18:49
0

awk usa um espaço como delimitador.

Tente isto:

$ awk '{print $1, $4, $5, $7, substr($16, 2, 7) }' file
chr1 11869 12227 + DDX11L1
chr1 12010 12057 + DDX11L1
    
por 07.08.2017 / 18:49