次のような .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 . この後、ファイル内でそのようなブロックを検索し続け、score>0.02 を含むブロックの開始位置と終了位置を取得する必要があります。繰り返しますが、そうすべきですスコア > 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 にプッシュして出力しようとしています。