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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 5973 | 回復(fù): 5
打印 上一主題 下一主題

區(qū)間合并 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2018-05-08 21:53 |只看該作者 |倒序瀏覽
各位大俠晚上好!
向大家請教:一個文件中有兩列,每一行是一個區(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

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

論壇徽章:
0
2 [報告]
發(fā)表于 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";
}

論壇徽章:
0
3 [報告]
發(fā)表于 2018-05-10 10:19 |只看該作者
回復(fù) 2# flywithperl
多謝這位大俠,我也是你這種思路,寫的比較坎坷,感謝幫忙!
想了下 另一種思路可以一次讀兩行進行判斷!



論壇徽章:
0
4 [報告]
發(fā)表于 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ù)制代碼

論壇徽章:
0
5 [報告]
發(fā)表于 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ù)制代碼

論壇徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役紀念章
日期:2018-03-16 10:24:0515-16賽季CBA聯(lián)賽之山東
日期:2017-11-10 14:32:142016科比退役紀念章
日期:2017-09-02 15:42:4715-16賽季CBA聯(lián)賽之佛山
日期:2017-08-28 17:11:5515-16賽季CBA聯(lián)賽之浙江
日期:2017-08-24 16:55:1715-16賽季CBA聯(lián)賽之青島
日期:2017-08-17 19:55:2415-16賽季CBA聯(lián)賽之天津
日期:2017-06-29 10:34:4315-16賽季CBA聯(lián)賽之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亞冠之薩濟拖拉機
日期:2015-05-22 11:38:5315-16賽季CBA聯(lián)賽之北京
日期:2019-08-13 17:30:53
6 [報告]
發(fā)表于 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

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP