1

すべての値が 0.3 を超える連続範囲を見つけたいです。例えば

A   1   10  0.2
A   20  40  0.4
A   60  75  0.5
A   90  100 0.55
A   200 205 0.43
A   211 270 0.8
A   450 511 0.1
A   513 550 0.0
B   1   10  0.6
B   50  200 0.7
B   300 350 0.8
B   400 500 0.9
B   600 711 0.4
B   800 900 0.2

出力:

A   20  270
B   1   711

私は試した:

while(<>){
        chomp($_);
        my @line = split("\t| ", $_);
        my $letter=$line[0];
        my @start;
        my @end;
                if($line[3]>0.3){
                        push (@start, $line[1]);
                        push (@end, $line[2]);

                        }
                if($line[3]<0.3){
                        next;}
                print $letter,"\t",$start[0],"\t",$end[-1],"\n";
                }

しかし、私は得る:

A       20      40
A       60      75
A       90      100
A       200     205
A       211     270
B       1       10
B       50      200
B       300     350
B       400     500
B       600     711

しかし、各適切な範囲の最初の開始と最後の終了のみが必要です

4

2 に答える 2

1

ハッシュを使用するのはどうですか?

#!/usr/bin/perl

use strict;
use warnings;

my %values;
while (<>) {
    chomp;
    my ($letter, $start, $end, $val) = split "\t| ";

    next if (defined $values{$letter}{skip_rest});

    if ($val > 0.3) {
        $values{$letter}{min} = $start
            if not defined $values{$letter}{min} or $values{$letter}{min} > $start;
        $values{$letter}{max} = $end
            if not defined $values{$letter}{max} or $values{$letter}{max} < $end;
    }
    elsif (defined $values{$letter}{min} and defined $values{$letter}{max}) {
        $values{$letter}{skip_rest} = "true";
    }
}

foreach my $letter (sort keys %values) {
    print "$letter\t$values{$letter}{min}\t$values{$letter}{max}\n";
}
于 2013-09-29T16:25:12.723 に答える