亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 區(qū)間合并 [打印本頁(yè)]

作者: Chinaaa123    時(shí)間: 2018-05-08 21:53
標(biāo)題: 區(qū)間合并
各位大俠晚上好!
向大家請(qǐng)教:一個(gè)文件中有兩列,每一行是一個(gè)區(qū)域,順序是從上向下遞增
start          end
10467        10472
10469        10474
10482        10487
10487        10492
10491        10496
10495        10500
10523        10528
10540        10545
10561        10566
10569        10574
10575        10580

目的:當(dāng)滿足$end-$start(下一行)=1條件時(shí),才合并該區(qū)域,如上述所示10492-10491=1,10496-10495=1;
得到最后結(jié)果應(yīng)該是:10487   10500;
麻煩大家了!

作者: flywithperl    時(shí)間: 2018-05-09 11:09
# data input
my $line;
my (@start, @end);
my $i;

while ($line = <>) {
        chomp($line);
        my ($start, $end) = split(/\s+/, $line);
        print "$start\t\t$end\n";
        push @start, $start;
        push @end, $end;
}
print "\n\n";


# data merge
my (@first, @second);

if (@start) {
        push @first, $start[0];
        for ($i=0; $i<$#start; $i++) {
                if ($end[$i] - $start[$i + 1] != 1) {
                        push @second, $end[$i];
                        push @first, $start[$i + 1];
                }
        }
        push @second, $end[-1];
}

# show result
print "\n\n";
for ($i=0; $i<@first; $i++) {
        print "$first[$i]\t\t$second[$i]\n";
}

作者: Chinaaa123    時(shí)間: 2018-05-10 10:19
回復(fù) 2# flywithperl
多謝這位大俠,我也是你這種思路,寫(xiě)的比較坎坷,感謝幫忙!
想了下 另一種思路可以一次讀兩行進(jìn)行判斷!




作者: kk861123    時(shí)間: 2018-05-19 16:12
逐行處理
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my @stack;
  6. while (<DATA>) {
  7.     my $rec = [split];
  8.     if (@stack) {
  9.         merge(\@stack, $rec);
  10.     } else {
  11.         push @stack, $rec;
  12.     }
  13. }

  14. print "@$_\n" for @stack;
  15. exit 0;

  16. sub merge {
  17.     my ($stack, $new) = @_;
  18.     my $last;
  19.     while (@$stack) {
  20.         $last = pop @$stack;
  21.         if ($last->[1] - $new->[0] == 1) {
  22.             $new = [ $last->[0], $new->[1] ];
  23.         } else {
  24.             push @$stack, $last;
  25.             last;
  26.         }
  27.     }
  28.     push @$stack, $new;
  29. }

  30. __DATA__
  31. 10467        10472
  32. 10469        10474
  33. 10482        10487
  34. 10487        10492
  35. 10491        10496
  36. 10495        10500
  37. 10523        10528
  38. 10540        10545
  39. 10561        10566
  40. 10569        10574
  41. 10575        10580
復(fù)制代碼

作者: kk861123    時(shí)間: 2018-05-19 16:12
逐行處理
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my @stack;
  6. while (<DATA>) {
  7.     my $rec = [split];
  8.     if (@stack) {
  9.         merge(\@stack, $rec);
  10.     } else {
  11.         push @stack, $rec;
  12.     }
  13. }

  14. print "@$_\n" for @stack;
  15. exit 0;

  16. sub merge {
  17.     my ($stack, $new) = @_;
  18.     my $last;
  19.     while (@$stack) {
  20.         $last = pop @$stack;
  21.         if ($last->[1] - $new->[0] == 1) {
  22.             $new = [ $last->[0], $new->[1] ];
  23.         } else {
  24.             push @$stack, $last;
  25.             last;
  26.         }
  27.     }
  28.     push @$stack, $new;
  29. }

  30. __DATA__
  31. 10467        10472
  32. 10469        10474
  33. 10482        10487
  34. 10487        10492
  35. 10491        10496
  36. 10495        10500
  37. 10523        10528
  38. 10540        10545
  39. 10561        10566
  40. 10569        10574
  41. 10575        10580
復(fù)制代碼

作者: 523066680    時(shí)間: 2018-05-19 17:52
本帖最后由 523066680 于 2018-05-19 17:55 編輯

如果數(shù)據(jù)量不大

  1. use File::Slurp;
  2. STDOUT->autoflush(1);

  3. my $data = read_file( "src.txt" );

  4. $data =~s/(\d+)\n(\d+)\s+/if ($1-$2 == 1) {print "Remove: $1 $2\n"; "";} else { ${&} }/eg;
  5. print $data;
復(fù)制代碼

Remove: 10492 10491
Remove: 10496 10495
start          end
10467        10472
10469        10474
10482        10487
10487        10500
10523        10528
10540        10545
10561        10566
10569        10574
10575        10580






歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2