-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 永远不会相互重叠,但假设不会,您可以使用 hash 来存储范围内的行。如果 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 回答
0

您可以split()每行并检查第二个和第三个字段:

#!/usr/bin/env perl

use strict;
use warnings;

my ($start, $end) = (shift, shift);
die if $start > $end;

## Skip header
<>;

while ( <> ) { 
    chomp;
    my @f = split;
    if ( $f[1] <= $start && $f[2] >= $end ) { 
        printf qq|%s\n|, $_; 
    }   
}

它接受三个参数,第一个是开始区域,第二个是结束区域,最后一个是要处理的文件。它打印以输出所有通过条件的行。

像这样运行它:

perl script.pl 10 15 infile

这会产生:

A       10      20
于 2013-10-30T21:11:02.533 回答