仅在值不同时替换值

时间:2014-12-04 16:09:13

标签: c regex vcf

我有一个像这样的vcf文件: http://www.1000genomes.org/node/101

以下是该网站的示例:

##fileformat=VCFv4.0
##fileDate=20090805
##source=myImputationProgramV3.1
##reference=1000GenomesPilot-NCBI36
##phasing=partial
##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency">
##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
##FILTER=<ID=q10,Description="Quality below 10">
##FILTER=<ID=s50,Description="Less than 50% of samples have data">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
#CHROM POS     ID        REF ALT    QUAL FILTER INFO                              FORMAT      NA00001        NA00002        NA00003
20     14370   rs6054257 G      A       29   PASS   NS=3;DP=14;AF=0.5;DB;H2           GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,.
20     17330   .         T      A       3    q10    NS=3;DP=11;AF=0.017               GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3   0/0:41:3
20     1110696 rs6040355 A      G,T     67   PASS   NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2   2/2:35:4
20     1230237 .         T      .       47   PASS   NS=3;DP=13;AA=T                   GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2
20     1234567 microsat1 GTCT   G,GTACT 50   PASS   NS=3;DP=9;AA=G                    GT:GQ:DP    0/1:35:4       0/2:17:2       1/1:40:3

在标题行之后,每一行都包含包含以第10个字段开头的基因型的字段。第10个字段低于NA0001标题;第11个字段是基因型NA0002等。我有一个包含123种不同基因型的文件,因此从第10位到第133位(NA0001直到NA0123)。这些字段中显示的内容可以是0 / 0,0 / 1,0 / 2 ....例如8/9。现在我想替换所有不相等的。所以我想保留0 / 0,1 / 1,2 / 2等。并通过./。替换0 / 1,0 / 2,0 / 4,4 / 5,4 / 6等。

我想用C脚本写这个。考虑使用sed y / regexp / replacement /但不知道如何在正则表达式中编写所有那些不相等的值。在文件中的其他位置也可能有这些值,所以实际上只有10到133的位置应该被替换。它需要被替换;我将需要使用新值的文件的其余部分。

希望很清楚。任何人都知道如何做到这一点?

1 个答案:

答案 0 :(得分:0)

此正则表达式应该符合您的要求:\s(\d)[|\/](?!\1)\d:将匹配替换为./.:

<强>故障:

\s(\d)匹配后跟单个数字的空格,捕获捕获组#1中的数字

[|\/]匹配管道或斜杠(因为似乎VCF格式允许)

(?!\1)\d使用否定前瞻来确保下一个字符与捕获组#1不同,并匹配数字

<强>注意事项:

我匹配了一个前导空格并跟踪:,以确保它只匹配预期的值。我无法找到一个好方法将它限制在10和之后的字段中。

使用perl的示例:

perl -pe 's@\s(\d)[|/](?!\1)\d:@ ./.:@g' testfile.vcf > testfile_afterchange.vcf

注意:我使用@作为分隔符,以避免必须转义正则表达式中的/个字符。