【问题标题】:Using awk to extract information from vcf file使用 awk 从 vcf 文件中提取信息
【发布时间】:2016-01-18 21:14:27
【问题描述】:

我有一个包含数百万行的文件,如下所示:

chr1    18217866        .       T       A       52.2409 .       AB=0;ABP=0;AC=2;AF=0;AN=2;AO=2;CIGAR=1X;DP=2;DPB=2;DPRA=0;EPP=7.35324;EPPR=0;GTI=0;LEN=1;MEANALT=1;MQM=60;MQMR=0;NS=1;NUMALT=1;ODDS=7.37776;PAIRED=0;PAIREDR=0;PAO=0;PQA=0;PQR=0;PRO=0;QA=74;QR=0;RO=0;RPP=7.35324;RPPR=0;RUN=1;SAF=2;SAP=7.35324;SAR=0;SRF=0;SRP=0;SRR=0;TYPE=snp      GT:DP:RO:QR:AO:QA:GL    1/1:2:0:0:2:74:-7.03,-0.60206,0

我试图在第二列中找到与给定数字匹配的所有行,其中AF=0 如下所示:

grep '1821786*' file.vcf | cut -f 8 | awk -F \; '$4 == 0 {print $4}' | wc -l

问题在于:

grep '1821786*' file.vcf | cut -f 8 |

打印:AF=0,这样就不会与 awk 语句中的 $4 == 0 比较匹配。

有没有办法去掉AF= 以便awk 语句匹配第4 列中的0

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    这一切都可以在单个 awk 中完成,并且更准确

    awk -F '[;[:blank:]]+' '$2 ~ /^1821786/ && $11 == "AF=0"{++n} END{print n}' file.vcf
    

    -F '[;[:blank:]]+' 将输入字段分隔符设置为分号或空格/制表符。

    【讨论】:

      【解决方案2】:

      实际上,awk 似乎有一个在这里有用的替换函数:

      grep '1821786*' file.vcf | cut -f 8 | awk -F \; '{sub(/AF=/,"")} $4 ==0 {print $4}' | wc -l
      

      这可以根据需要用于 vcf 文件中的任何其他信息。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多