我有3列的文件 - >以只形成連續範圍的值
A1 0 9 A1 4 14 A1 16 24 A1 25 54 A1 64 84 A1 74 84 A2 15 20 A2 19 50
我要檢查,如果每一行(在COL2值和3)是目前已經或正在的範圍之間上一行,如果col1值相等。 所需的輸出是 - >
A1 0 14 A1 16 54 A1 64 84 A2 15 50
我曾嘗試 - >
@ARGV or die "No input file specified";
open $first, '<',$ARGV[0] or die "Unable to open input file: $!";
#open $second,'<', $ARGV[1] or die "Unable to open input file: $!";
$k=0;
while (<$first>)
{
if($k==0)
{
@cols = split /\s+/;
$p0=$cols[0];
$p1=$cols[1];
$p2=$cols[2];
$p3=$cols[2]+1;
}
else{
@new = split /\s+/;
if ($new[0] eq $p0){
if ($new[1]>$p3)
{
print join("\t", @new),"\n";
$p0=$new[0];
$p1=$new[1];
$p2=$new[2];
$p3=$new[2]+1;
}
elsif ($new[2]>=$p2)
{
print $p0,"\t",$p1,"\t",$new[2],"\n";
$p2=$new[2];
$p3=$new[2]+1;
}
else
{
$p5=1;
}
}
else
{
print join("\t", @new),"\n";
$p0=$new[0];
$p1=$new[1];
$p2=$new[2];
$p3=$new[2]+1;
}}
$k=1;
}
和我得到的輸出 - >
A1 0 14 A1 16 24 A1 16 54 A1 64 84 A1 64 84 A2 15 20 A2 22 50
我無法理解爲什麼我得到這個錯誤的輸出。此外,如果有任何方法可以擦除(或覆蓋)最後打印的行,那麼這將非常容易。
使用一個:http://p3rl.org/News::Newsrc http://p3rl.org/Number: :Interval http://p3rl.org/Parse::Range http://p3rl.org/Set::IntSpan [:: Fast](http://p3rl.org/Set::IntSpan::Fast)[: :XS](http://p3rl.org/Set::IntSpan::Fast::XS) – daxim 2012-02-27 14:17:36