-3

座標のリストを分析しようとしています。txt ファイルは次のように設定されます。

ID START END
A  10    20
B  15    17
C  20    40

このデータセットをチェックして、START と END がユーザー指定の領域 (START=10 END=15 など) に含まれているかどうかを確認するにはどうすればよいですか?

どんな助けでも大歓迎です

// 編集 //

if(@AGRV != 4) {
    print STDOUT "Searches genomic data for CNV within range. \n";
    print STDOUT "CNV FILE FORMAT: <ID><CHR>BPS><BPE><AGE><etc...> \n";
    print STDOUT "USAGE: [CNVLIST][CHR][BPS][BPE][OUTFILE] \n";
    exit;
}

open(CNVLIST,"<$ARGV[0]");
open(OUTFILE,">$ARGV[3]");

$BPS = $ARGV[1];
$BPE = $ARGV[2];

#put CNV file in hash table
$line = <CNVFILE>;
while($line = <CNVFILE>) {
    chomp $line;
    ($Cchr,$CS,$CE,$CID) = split(/\t/,$line);
}

各行を調べて、開始/終了がユーザー指定の範囲内にあるかどうかを確認する必要があります。

4

2 に答える 2

1

IDが重複しないと仮定できるかどうかは不明ですが、重複しないと仮定すると、ハッシュを使用して範囲内の行を格納できます。IDが重複する可能性がある場合は可能だと思いますがpush @{$result{id}}, [$start, $end];、データ構造が少し複雑になります。

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my $in_file = "input.txt";
# User-specified region
my $range_start = 10;
my $range_end = 15;

open my $fh, $in_file or die $!;

my %result;
while (<$fh>) {
    my ($id, $start, $end) = split " ", $_;
    next unless $start =~ /\d/;

    # Swap if START is larger than END
    ($start, $end) = ($end, $start) if $start > $end;

    $result{$id} = [$start, $end]
        if $start >= $range_start and $end <= $range_end;
}

print Dumper(%result);
于 2013-10-30T22:12:14.753 に答える