我的目标是从基因组测序Fastq文件中提取数据并绘制它们。我想获得每个测序读数的识别信息,然后获得有关读取的两条信息。
下面我已经从Fastq文件中粘贴了两个读取内容,以供参考。如果有帮助的话。
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 12_S12_L001
chr1 115227813 . C G 2120.73 . AB=0.725;ABP=73.366;AC=1;AF=0.5;AN=2;AO=116;CIGAR=1X;DP=160;DPB=160;DPRA=0;EPP=254.901;EPPR=87.6977;GTI=0;LEN=1;MEANALT=3;MQM=60;MQMR=60;NS=
1;NUMALT=1;ODDS=152.168;PAIRED=0.991379;PAIREDR=1;PAO=0;PQA=0;PQR=0;PRO=0;QA=3761;QR=1366;RO=39;RPP=254.901;RPPR=87.6977;RUN=1;SAF=116;SAP=254.901;SAR=0;SRF=39;SRP=87.6977;SRR=0;TYPE=snp GT:DP:RO:QR:AO:Q
A:GL 0/1:160:39:1366:116:3761:-10,0,-10
chr1 115227814 . G A,C,T 8.27007e-12 . AB=0,0,0;ABP=0,0,0;AC=0,0,0;AF=0,0,0;AN=2;AO=120,11,35;CIGAR=1X,1X,1X;DP=84826;DPB=84826;DPRA=0,0,0;EPP=263.587,26.8965,79.0118;EPPR
=183840;GTI=0;LEN=1,1,1;MEANALT=3,3,3;MQM=60,60,60;MQMR=59.9996;NS=1;NUMALT=3;ODDS=115105;PAIRED=1,1,1;PAIREDR=0.990917;PAO=0,0,0;PQA=0,0,0;PQR=0;PRO=0;QA=4206,292,1061;QR=2822527;RO=84660;RPP=263.587,26.
8965,79.0118;RPPR=183840;RUN=1,1,1;SAF=120,11,35;SAP=263.587,26.8965,79.0118;SAR=0,0,0;SRF=84660;SRP=183840;SRR=0;TYPE=snp,snp,snp GT:DP:RO:QR:AO:QA:GL 0/0:84826:84660:2822527:120,11,35:4206,292,1
061:0,-10,-10,-10,-10,-10,-10,-10,-10,-10
在上面,您可以看到每个读数都以读取的染色体编号和第1列和第2列中该染色体上读数的位置开始。在第4列中有参考碱基对和第5列包含变体读取。然后在第8列中有一堆关于读取的其他信息,其中每个部分用分号分隔。
我关注的两个数字是以下内容:RO=
和AO=
。
我想创建一个输出文件,其中只包含第1,2,4,5列中的信息,然后在最后一列中放入AO / RO的分数。
作为从第一行开始的输出示例,我想要输出以下内容:
chr1 115227813 C G 0.74838
chr1 115227814 G A,C,T 0.00142
其中0.74838由RO = 39和AO = 116计算,因此116 /(39 + 116)= 0.74838。 并且从RO = 84660和AO = 120计算得出120 /(84660 + 120)= 0.00142
希望这能澄清我正在寻找的输出。
答案 0 :(得分:2)
这需要一些研究来了解如何在awk
中进行一种后视。通过a thread in google groups发现它很有意思!
我们的想法是使用gensub()
获取给定行中的variable=value
,然后将其打印回来,删除该行的其余内容。因此,如果我们有hello hello;AO=23;bla bla bla
,那么我们就会获得23
。
awk 'v {
ro=gensub(/^.*;RO=([0-9]*).*$/, "\\1", "1");
printf "%s %f\n", f, (ao/(ao + ro)); v=0
}
/^chr/ {ao=gensub(/^.*;AO=([0-9]*).*$/,"\\1", "1");
v=1;
f=$1 FS $2 FS $4 FS $5
}' file
基本上,我们会查找以chr
开头的行。在这些中,我们捕获第1,第2,第4和第5个值。然后,我们捕获AO=
旁边的任何内容(仅限数字)。
由于RO=
出现在下一行,我们设置了一个标志,以便在读取下一行时搜索它。然后,我们得到该值并打印完整的数据集。最后我们取消了标志,所以我们再次开始循环。
$ awk 'v {ro=gensub(/^.*;RO=([0-9]*).*$/, "\\1", "1"); printf "%s %f\n", f, (ao/(ao + ro)); v=0} /^chr/ {ao=gensub(/^.*;AO=([0-9]*).*$/,"\\1", "1"); v=1; f=$1 FS $2 FS $4 FS $5}' a
chr1 115227813 C G 0.748387
chr1 115227814 G A,C,T 0.001415