c - 仅当值不同时才替换它们

标签 c regex vcf-vcard

我有一个像这样的 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、1/2、4/5、4/6 等。

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

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

最佳答案

这个正则表达式应该做你想做的:\s(\d)[|\/](?!\1)\d:./.: 替换匹配项

segmentation :

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

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

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

注意事项:

我匹配了前导空格和尾随 :尝试确保它只匹配预期的值。我想不出一个好方法来将它限制在字段 10 及之后。

使用 perl 的示例:

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

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

关于c - 仅当值不同时才替换它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27298628/

相关文章:

iphone - 将 NSArrays 转换为 C 样式( double )数组的最快例程是什么?

c - 如何观察父进程和子进程之间的资源争用

c - 从列表中删除节点时出现段错误 (C)

regex - 无法理解捕获组和反向引用

vcf-vcard - 是否可以生成绕过 Thunderbird 换行错误的 vcard 2.1?

c - 使用 gcc 编译时,Tcl 解释器 undefined reference 错误

python - 如何忽略后视中的特定单词?

用于微笑图像替换的 Javascript 正则表达式

html - 如何在 html 中实现自定义自动完成列表?

csv - 合并来自 vcf 的大量联系人的重复项