извлекать содержимое переменной строки между каналами в файле VCF

эта проблема может выглядеть связанной с генетикой, но на самом деле она основана на программировании.

У меня есть следующий файл vcf (конкретный файл txt, полученный из инструмента, называемого VEP) с заголовком и этим содержимым столбцов:

      #CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  sample.F
chr1    10643146    .   G   GC  63.2    PASS    CSQ=|FAIL|0.00|0.00|0.01|0.00|13|40|-3|13|||MODIFIER|CASZ1|ENSG00000130940|ENST00000377022|protein_coding||19/20|||||,|FAIL|0.00|0.00|0.01|0.00|13|40|-3|13|||MODIFIER|AL139423.1|ENSG00000272078|ENST00000606802|lncRNA||1/1|||||  GT:GQ:DP:AD:VAF:PL  0/1:58:86:40,45:0.523256:63,0,59
chr1    10646034    .   G   C   64.8    PASS    CSQ=|FAIL|0.00|0.00|0.00|0.00|22|3|1|2|||MODIFIER|CASZ1|ENSG00000130940|ENST00000377022|protein_coding||17/20|||||,|FAIL|0.00|0.00|0.00|0.00|22|3|1|2|||MODIFIER|AL139423.1|ENSG00000272078|ENST00000606802|lncRNA||1/1|||||    GT:GQ:DP:AD:VAF:PL  0/1:59:27:13,14:0.518519:64,0,60

Я хотел бы извлечь только имя гена в первом столбце и хромосомную позицию во втором столбце, чтобы мой окончательный файл мог понравиться:

      chr1:10643146             CASZ1

Плагин BCFtools https://samtools.github.io/bcftools/howtos/plugin.split-vep.html не подходил, поэтому я решил применить индивидуальный подход.

  1. Я написал строку, которая распечатывает нужные столбцы:

awk 'BEGIN {OFS ="\t" ; FS = "\t"};{print $1, $2, $8}' sample > out

  1. Я запутался, какая команда bash подходит для извлечения поля № 13 между трубками (то есть строки, начинающейся с CSQ: строки CASZ1, после MODERATE в этом примере), так что из всей этой длинной строки я получаю только строки между символами каналов 13 . и 14.

Из

      CSQ=|FAIL|0.00|0.00|0.00|0.00|22|3|1|2|||MODIFIER|CASZ1|ENSG00000130940|ENST00000377022|protein_coding||17/20|||||,|FAIL|0.00|0.00|0.00|0.00|22|3|1|2|||MODIFIER|AL139423.1|ENSG00000272078|ENST00000606802|lncRNA||1/1||||| 

к

      CASZ1
  1. Я посмотрел решения в SO, нашел следующее:

bash, как извлечь поле на основе его содержимого из строки с разделителями

но проблема в том, что строки в поле № 13 являются переменными, поэтому мне это не подходит.

Какой подход к сценарию оболочки я должен использовать?

Спасибо!

2 ответа

      $ awk -F'[\t|]' -v OFS='\t' 'NR>1{print $1":"$2, $21}' file
chr1:10643146   CASZ1
chr1:10646034   CASZ1

Я попробовал плагин bcftools, но получил:

      The field "Consequence" is not present in INFO/CSQ: "Consequence annotations from Ensembl VEP. Format: 'Allele

В моем vcf есть поля CSQ, но нет полей с именем "Последствия"

Другие вопросы по тегам