[新人求教]统计两个VCF文件在捕获区域中的一致性与SNP、INDEL数量
为了能够得到INPUT1、2文件在捕获区间RANGE中的一致性,并统计其中的质量合格的SNP与INDEL数,于是写出了以下的一段程序...效率实在太低了,请各位前辈给出一点宝贵的意见优化下程序,或是更好的方案 感激不尽!
以下是统计的部分,因为其它部分太长就不贴出了来了;
RANGE:捕获区间(第一列为染色号,如chr1 ,第二、三列为左闭右开的区间如2、5即为 [ 2 , 5 ) ; )
INPUT1、INPUT2:进行筛选与比对的vcf文件;
while(<RANGE>){
chomp;
my @s=split;
while(<INPUT1>){
chomp;
next if(/#/);
next if(/^(?!.*PASS)/);
my @t=split;
next if($s[0]ne$t[0]or$s[1]gt$t[1]or$t[1]ge$s[2]);
my $id=join "-",$t[0],$t[1],$t[3],$t[4];
if(/Dels=0.00/){
$hash_s{$id}=0;
$A_snp++;}
elsif(/^(?!.*Dels)/){
$hash_i{$id}=0;
$A_indel++;}
}
seek INPUT1,0,0;
}
seek RANGE,0,0;
while(<RANGE>){
chomp;
my @s=split;
while(<INPUT2>){
chomp;
next if(/#/);
next if(/^(?!.*PASS)/);
my @t=split;
next if($s[0]ne$t[0]or$s[1]gt$t[1]or$t[1]ge$s[2]);
my $id=join "-",$t[0],$t[1],$t[3],$t[4];
if(/Dels=0.00/){
$B_snp++;}
if(/^(?!.*Dels)/){
$B_indel++;}
if(exists $hash_s{$id}){
$S_share++;
}
elsif(exists $hash_i{$id}){
$I_share++;
}
}
seek INPUT2,0,0;
}
[此贴子已经被作者于2020-4-29 09:50编辑过]