从Fastq文件中提取特定信息以进行Sequencing Analysis

时间:2015-04-04 21:42:06

标签: bash awk pattern-matching fastq sequencing

我的目标是从基因组测序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

希望这能澄清我正在寻找的输出。

1 个答案:

答案 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