Преобразование текстового файла с разделителями табуляции в отчет HTML/PDF/latex/knitr

Это файл с разделителями табуляции:

Chr Начало Конец Ref Alt Func.refGene    Gene.refGene    GeneDetail.refGene  ExonicFunc.refGene  AAChange.refGene    snp138  clinvar_20140929    SIFT_score  SIFT_pred   Polyphen2_HDIV_score    Polyphen2_HDIV_pred Polyphen2_HVAR_score    Polyphen2_HVAR_pred LRT_score   LRT_pred    MutationTaster_score    MutationTaster_pred MutationAssessor_score  MutationAssessor_pred   FATHMM_score    FATHMM_pred RadialSVM_score RadialSVM_pred  LR_score    LR_pred VEST3_score CADD_raw    CADD_phred  GERP++_RS   phyloP46way_placental   phyloP100way_vertebrate SiPhy_29way_logOdds
chr13   52523808    52523808 КТ-экзоник ATP7B, несинонимичный SNV   ATP7B:NM_000053:exon12:c.2855G>A:p.R952K,ATP7B:NM_001243182:exon13:c.2522G>A:p.R841K-non-patgenS-non-patgen = non-patgenS CLNDBN=Wilson's_disease|not_specified;CLNREVSTAT= одинарная | одинарный;CLNACC=RCV000029357.1|RCV000078044.1;CLNDSDB=GeneReviews:MedGen:OMIM:Orphanet:SNOMED_CT|;CLNDSDBID=NBK1512:. C0019202:277900:ORPHA905:88518009|, 0,99    T   0,04    B   0,03    B   0,000   N   0,000   P   -1,04   N   -3,73   D   -0,965  T   0,000 T 0,214   1,511   11,00   6,06    1,111 2,71 12,356
chr13   52523867    52523867    T   G экзон ATP7B синонимичен SNV ATP7B: NM_000053: экзон 12:c.2796A>C:p.S932S,ATP7B:NM_001243182:exon13:c.2463A>C:p.S821S 

У меня есть скрипт bash, который принимает файл ABI в качестве входных данных и использует ANNOVAR для аннотирования вариантов. Создается текстовый файл с разделителями табуляции, содержащий аннотированные варианты. Таким образом, каждый раз, когда сценарий bash выполняется для разных файлов ABI, количество столбцов в файле с разделителями табуляции фиксируется, но количество строк, а также отдельные аннотации могут различаться для каждого полученного варианта.

Попытки пока ->

Я попытался написать сценарий bash, который извлекает [для первого варианта] различные поля из текстового файла с разделителями табуляции, сохраняет его как текстовый файл, объединяет все полученные текстовые отдельные файлы и, используя сценарий AWK, назначает разные переменные для каждого из поля в комбинированном текстовом файле. Я создал HTML-страницу с использованием AWK и использовал эти переменные в скрипте AWK для печати в соответствующих тегах в HTML, и он отлично работает для файла, который следует той же схеме в текстовом файле с разделителями табуляции. Но когда отдельное поле отсутствует для других аннотированных результатов с другим шаблоном, сценарий печатает поля, отличные от той, для которой он был назначен.

Если первый вариант содержит Клинически значимую мутацию, в столбце "Clinvar" будет присутствовать аннотация, и, следовательно, об этом необходимо сообщить в другом разделе вместе с другими деталями.

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

Ожидаемый результат ->

Так как формат файла с разделителями табуляции не является одинаковым, есть ли способ, чтобы для каждой строки я мог установить несколько условий, например, если у определенного столбца [для ex: clinvar] есть значение, то распечатать его между тегами HTML и если он отсутствует, то проверьте наличие другого столбца [для ex: rsID], и если значение присутствует, выведите его в некоторых других тегах HTML и так далее для других столбцов!

Вариант позиции:chr13:52523808C>T

Тип варианта: не синонимично-SNV

rsID: rs732774

Замена аминокислоты: p.R952K

Имя гена:ATP7B

Болезнь: Болезнь Вильсона

Результат: непатогенный

Формат HTML-страницы и значения в ней должны быть примерно такими:

<html>
<title></title><head>
<style type="text/css">
body {background-color:lightgray}
h1   {background-color:SlateGray}
</style>
</head><body bgcolor="LightGray">
<table border=1><th align=>Test Code</th><th align=>Gene Name</th><th align=>Condition tested</th><th align=>Result</th>
<tr><td width=750 align=></td><td width=750 align=>ATP7B(RefSeq ID: NM_000053)</td><td width=750 align=>Wilson's_disease</td><td width=750 align=>Non-pathogenic</td></tr>
<h1 align=>Test Details</h1>
<table border=1><th align=centre>Genomic Location of Mutation</th><th align=centre>Mutation Type</th><th align=centre>dbSNP Identifier</th><th align=centre>Amino Acid Change</th><th align=centre>OMIM Identifier</th>
<h1 align=>Significant Findings</h1>
<tr><td width=750 align=>chr13:52523808C>T</td><td width=750 align=>Nonsynonymous-SNV</td><td width=750 align=>rs732774</td><td width=750 align=>p.R952K</td><td width=750 align=>http://www.omim.org/entry/277900</td></tr>
<p> The identified variant is located in the <strong> exonic </strong> region of the <strong> chr13 </strong> chromosome and is a <strong> Nonsynonymous-SNV </strong> which causes an amino acid change from <strong> Arginine </strong> to <strong> Lysine </strong>. The mutation has also been reported in the dbSNP database (http://www.ncbi.nlm.nih.gov/SNP/) with an accession number of <strong> rs732774 </strong>. </p>
</table></body>
</html>

Аналогичным образом, когда существует новый вариант, в котором столбец ExonicFunc.refGene содержит "несинонимичный" и в столбце snp138 нет значения, он должен напечатать SIFT_score вместе с другими деталями между тегами HTML. Это лишь некоторые из условий, которые необходимы, но если кто-то может дать представление о том, как все это сделать, это будет действительно полезно!!!

Спасибо за чтение такого длинного номера, и любая помощь по этой проблеме будет принята с благодарностью.

1 ответ

Программа awk, которую я покажу вам здесь, разбивает все заголовки и все данные в соответствующих строках. Я думаю, что вы можете изменить его, чтобы настроить ваши потребности. Имейте в виду, что все колючие правила, которые у вас есть - когда это не появляется, показывают, что вместо этого - лучше реализовать сами, чем просить о реализации.

#
# processor.awk
#


BEGIN   {
        IGNORECASE = 1; 
        header = ""; 
        html_template = "<tr><td>##fieldname</td><td>##fieldvalue</td></tr>"
        }
        {
        if( header == "" && $0 != "" )
        {   # the first not empty line is the header
            header = $0; 
            # put every element of the header into an array
            split( header, fields, "\t" );
            # for debug: print the fields found
            #for( elem in fields ) 
            #   print "field" elem ": " fields[elem];
        } # if 
        else
        {
            # normal lines
            # split the line into the elements 
            split( $0, content, "\t" ); 
            # for every element in the content line....
            for( elem = 1; fields[elem] !=""; elem++ )
            {
                print elem;
                out_line = html_template; 
                out_line = gensub( /##fieldname/, fields[elem], "g", out_line );
                out_line = gensub( /##fieldvalue/, content[elem], "g", out_line ); 
                # print the result
                print out_line;
            } # for 
        } # if 
        }
END     {
        }
Другие вопросы по тегам