2013-11-15 2 views
1

У меня есть GTF файл из нескольких столбцов, где каждая строка имеет разное количество столбцов:Извлечение колонн значения соответствия определенному шаблону

chr1 Cufflinks exon 12659 12721 . + . gene_id "XLOC_000001"; transcript_id "TCONS_00000001"; exon_number "1"; oId "CUFF.3.1"; class_code "u"; tss_id "TSS1"; 
chr1 Cufflinks exon 13221 16604 . + . gene_id "XLOC_000001"; transcript_id "TCONS_00000001"; exon_number "2"; oId "CUFF.3.1"; class_code "u"; tss_id "TSS1"; 
chr1 Cufflinks exon 29554 30039 . + . gene_id "XLOC_000002"; transcript_id "TCONS_00000002"; exon_number "1"; gene_name "MIR1302-11"; oId "ENST00000473358"; nearest_ref "ENST00000473358"; class_code "="; tss_id "TSS2"; 
chr1 Cufflinks exon 30564 30667 . + . gene_id "XLOC_000002"; transcript_id "TCONS_00000002"; exon_number "2"; gene_name "MIR1302-11"; oId "ENST00000473358"; nearest_ref "ENST00000473358"; class_code "="; tss_id "TSS2"; 
chr1 Cufflinks exon 69091 70008 . + . gene_id "XLOC_000003"; transcript_id "TCONS_00000005"; exon_number "1"; gene_name "OR4F5"; oId "ENST00000335137"; nearest_ref "ENST00000335137"; class_code "="; tss_id "TSS4"; p_id "P1"; 

Я только хочу столбцы, соответствующие шаблону «gene_id„...“ ;» 'transcript_id "...";' 'class_code "..";'

Я попытался удалить ненужные столбцы с помощью:

sed -e 's/nearest_ref\s\"[A-Z]\{4\}[0-9]\{11\}\"\;//' -e 's/oId\s\"[A-Z|\.|0-9]*\"\;//' -e 's/gene_name\s\"[A-Z|0-9|\.|\-]*\"\;//' -e 's/contained_in\s\"[A-Z|\_|0-9]*\"\;//' -e 's/p_id*\s\".*\"\;//' merged.gtf > temp.gtf 

Но похоже, что есть много других нежелательных столбцов в файле, который я не могу увидеть (файл большой). Как извлечь нужные столбцы и сохранить их в другой файл?

+0

ли поля всегда 'gene_id«...»;' , 'transcript_id" ... ";' и 'class_code" ... ";'? –

+0

Есть ли причина, по которой это помечено [tag: r]? – Thomas

+0

поля gen_id, а затем пробел, за которым следуют двойные кавычки, за которыми следует любое число буквенно-цифровых символов, за которыми следуют другие двойные кавычки, за которыми следует точка с запятой. –

ответ

3

Если вы не возражаете дополнительное пространство косой, и мои предположения в моем комментарии выше верно, то должно работать:

awk '{ 
    for (i = 1; i <= NF; i++) { 
     if ($i ~ /gene_id|transcript_id|class_code/) { 
      printf "%s %s ", $i, $(i + 1) 
     } 
    } 
    print "" 
}' merged.gtf > temp.gtf 
+0

Спасибо! это сработало !! –

Смежные вопросы