Bash 从Fastq文件中提取特定信息进行序列分析

Bash 从Fastq文件中提取特定信息进行序列分析,bash,awk,pattern-matching,fastq,sequencing,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

我的目标是从基因组测序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列包含变量read。然后在第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 so 120/(84660+120)=0.00142计算得出


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

这需要一些研究来找出如何在
awk
中进行一种查找。这是有趣的发现它通过

其思想是使用获取给定行中的
变量=值
,然后将其打印回来,删除行中的其余内容。所以如果我们有
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
开头的行。在这些函数中,我们捕捉第一、第二、第四和第五个值。然后,我们捕获
AO=
(仅数字)旁边的内容。 由于
RO=
出现在下一行中,因此我们在读取下一行时设置了一个标志来搜索它。然后,我们得到该值并打印完整的数据集。最后,我们取消设置标志,以便再次开始循环

试验
一个期望的输出通常是最好的解释没有问题,我可以让这更清楚一点。请显示第二行数据的输出,您想要字段5中的整个a、T、C吗?祝你好运。没问题,是的,我确实想要第五场的一切。漂亮,这正是我想要的。多谢你,费多尔基。
$ 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