Преобразование текстового файла с разделителями табуляции в отчет 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 {
}