我有一个 .bedGraph 文件,如下所示:
chr start end score
chr1 3000305 3000306 0.006
chr1 3000306 3000307 0.01
chr1 3000307 3000308 0.014
chr1 3000308 3000309 0.017
chr1 3000309 3000310 0.019
chr1 3000310 3000313 0.021
chr1 3000313 3000314 0.029
chr1 3000314 3000315 0.027
chr1 3000315 3000316 0.02
chr1 3000316 3000317 0.011
我必须编写一个脚本,它将遍历该文件并查找分数 >0.02,获取该分数的起始值,然后继续搜索,直到它达到分数 <0.02,此时它应该获取前一个结束位置。所以在这种情况下,程序应该从文件的开头开始遍历,确定第一个分数>0.02,获取该分数的起始位置=3000310,然后继续搜索,直到分数低于0.02,此时它应该获取上一个结束位置= 3000316。在此之后,它应该继续在文件中搜索这些块,并获取包含分数>0.02的块的开始和结束位置。再次,它应该不要抓取包含 score>0.02 的块的所有开始和结束,而只抓取此类块的第一个开始和最后一个结束。
我已经编写了部分代码,但不知道如何进一步进行:
open BEDGRAPH, $ARGV[0] or die print $!;
my $thresh=0.5;
my $j=1;
my $i=1;
my @arr = <BEDGRAPH>;
my @tmp;
for $i (0 .. $#arr)
{
my ($chr, $start, $end, $score) = split('\s',$arr[$i]);
if($score>=$thresh)
{
push(@tmp,$chr);
push(@tmp,$start);
$j=$i+1;
my ($chr1, $start1, $end1, $score1) = split('\s',$arr[$j]);
while($score1>=$thresh)
{
$j=$j+1;
}
my ($chr2, $start2, $end2, $score2) = split('\s',$arr[$j-1]);
push(@tmp,$end2);
$i=$j+1;
print @tmp;
}
elsif($score>=$thresh)
{
$i=$i+1;
}
}
close(BEDGRAPH);
在这里,我试图在@tmp 中推送所需的开始和结束位置并打印它。