1

次のような .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 にプッシュして出力しようとしています。

4

4 に答える 4

2

ThisSuitisBlackNot で指摘されているように、プログラムを変更する必要があると思います。可能な解決策を投稿すると思いました。

更新: chr 名が変更される可能性がある場合、このプログラムは機能しない可能性があり、調整が必要です。

#!/usr/bin/perl
use strict;
use warnings;

my ($prev_chr, $prev_start, $prev_end);
my $thresh = .02;

while (<DATA>) {
    my ($chr, $start, $end, $score) = split;

    if ($score >= $thresh) {
        $prev_chr   //= $chr;
        $prev_start //= $start;
        $prev_end = $end;
    }
    else {
        if ($prev_chr) {
            print "$prev_chr $prev_start $prev_end\n";
            ($prev_chr, $prev_start, $prev_end) = (undef) x 3;
        }
    }
}
print "$prev_chr $prev_start $prev_end\n" if $prev_chr;

__DATA__
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
于 2013-09-27T19:39:27.827 に答える
0

次の点を考慮してください。

use strict;
use warnings;

my $startFound = 0;
my $priorEnd;

while (<>) {
    $. > 1 or next;    # Get past the header
    my ( undef, $start, $end, $score ) = split;

    if ( $score > .02 and !$startFound ) {
        $startFound = 1;
        print "Start: $start\n";
    }

    if ( $score < .02 and $startFound ) {
        $startFound = 0;
        print "End  : $priorEnd\n";
    }

    $priorEnd = $end;
}

使用法:perl script.pl inFile [>outFile]

最後のオプション パラメータは、出力をファイルに送信します。

このスクリプトは$startFound、ブロックの開始を知らせるフラグ ( ) を設定し、スコアが .02 未満であることを確認し、そのフラグをチェックしてそのブロックの終了を検出します。var$priorEndは、開始/終了ペアの最後の「終了」値を保持するだけです。

お役に立てれば!

于 2013-09-28T18:08:28.580 に答える