我有一个像这样的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的位置应该被替换。它需要被替换;我将需要使用新值的文件的其余部分。
希望很清楚。任何人都知道如何做到这一点?
答案 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
注意:我使用@
作为分隔符,以避免必须转义正则表达式中的/
个字符。