2013-10-30 28 views
-3

我想分析一個座標列表。 TXT文件設置是這樣的:分析perl中的一個txt列表

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

我怎麼會檢查這個數據集,以檢查是否開始和結束包括用戶指定的區域內,例如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

您是否嘗試自己解決此問題?如果沒有,請努力併發布顯示您所寫代碼的問題。請閱讀[FAQ]和[Ask]。 –

+0

完全位於用戶指定的範圍內,或至少與用戶指定的範圍重疊? – ysth

回答

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); 
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