分析perl中的txt列表

时间:2013-10-30 20:31:15

标签: perl

我正在尝试分析坐标列表。 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);
}

我需要查看每一行并查找开始/结束是否在用户指定的范围内。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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