免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: newfinder
打印 上一主题 下一主题

差异筛选问题 [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
11 [报告]
发表于 2014-07-26 09:48 |只看该作者
本帖最后由 yestreenstars 于 2014-07-28 15:37 编辑
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use 5.010;

  5. sub JiaoJi {
  6.         return 2 if $_[0][0] <= $_[1][0] && $_[0][1] >= $_[1][1] || $_[0][0] >= $_[1][0] && $_[0][1] <= $_[1][1];
  7.         return ($_[0][1] - $_[1][0] > 2) ? 2 : 0 if $_[0][0] <= $_[1][0] && $_[0][1] <= $_[1][1];
  8.         return ($_[1][1] - $_[0][0] > 2) ? 2 : 1 if $_[0][0] >= $_[1][0] && $_[0][1] >= $_[1][1];
  9. }

  10. open(FILE1, 'data1.txt') or die;
  11. open(FILE2, 'data2.txt') or die;

  12. my(%hash1, %hash2);

  13. while(<FILE1>){
  14.         chomp;
  15.         @_ = split /[:-]/;
  16.         push(@{$hash1{$_[0]}}, [$_[1], $_[2]]);
  17. }

  18. while(<FILE2>){
  19.         chomp;
  20.         @_ = split /[:-]/;
  21.         push(@{$hash2{$_[0]}}, [$_[1], $_[2]]);
  22. }

  23. close(FILE1);
  24. close(FILE2);

  25. for my $key (keys %hash1){
  26.         while(@{$hash1{$key}}){
  27.                 while(@{$hash2{$key}}){
  28.                         unless(@{$hash1{$key}}){
  29.                                 open(OUTPUT_FILE, '>>data2_diff.txt');
  30.                                 printf OUTPUT_FILE "%s:%d-%d\n", $key, $_->[0], $_->[1] for @{$hash2{$key}};
  31.                                 undef @{$hash2{$key}};
  32.                                 close(OUTPUT_FILE);
  33.                                 last;
  34.                         }
  35.                         given(JiaoJi($hash1{$key}[0], $hash2{$key}[0])){
  36.                                 when(0){
  37.                                         open(OUTPUT_FILE, '>>data1_diff.txt');
  38.                                         say OUTPUT_FILE "$key:$hash1{$key}[0][0]-$hash1{$key}[0][1]";
  39.                                         shift @{$hash1{$key}};
  40.                                 }
  41.                                 when(1){
  42.                                         open(OUTPUT_FILE, '>>data2_diff.txt');
  43.                                         say OUTPUT_FILE "$key:$hash2{$key}[0][0]-$hash2{$key}[0][1]";
  44.                                         shift @{$hash2{$key}};
  45.                                 }
  46.                                 when(2){
  47.                                         open(OUTPUT_FILE, '>>data_comm.txt');
  48.                                         say OUTPUT_FILE "$key:$hash1{$key}[0][0]-$hash1{$key}[0][1] $hash2{$key}[0][0]-$hash2{$key}[0][1]";
  49.                                         shift @{$hash1{$key}};
  50.                                         shift @{$hash2{$key}};
  51.                                 }
  52.                         }
  53.                         close(OUTPUT_FILE);
  54.                 }
  55.                 open(OUTPUT_FILE, '>>data1_diff.txt');
  56.                 printf OUTPUT_FILE "%s:%d-%d\n", $key, $_->[0], $_->[1] for @{$hash1{$key}};
  57.                 undef @{$hash1{$key}};
  58.                 close(OUTPUT_FILE);
  59.         }
  60. }
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
12 [报告]
发表于 2014-07-26 09:52 |只看该作者
本帖最后由 yestreenstars 于 2014-07-28 15:39 编辑

如果是Cygwin的话就用这个,我不明白为什么Cygwin下用given语句会报错,有人知道吗?
  1. #!perl
  2. use warnings;
  3. use strict;

  4. sub JiaoJi {
  5.         return 2 if $_[0][0] <= $_[1][0] && $_[0][1] >= $_[1][1] || $_[0][0] >= $_[1][0] && $_[0][1] <= $_[1][1];
  6.         return ($_[0][1] - $_[1][0] > 2) ? 2 : 0 if $_[0][0] <= $_[1][0] && $_[0][1] <= $_[1][1];
  7.         return ($_[1][1] - $_[0][0] > 2) ? 2 : 1 if $_[0][0] >= $_[1][0] && $_[0][1] >= $_[1][1];
  8. }

  9. open(FILE1, 'data1.txt') or die;
  10. open(FILE2, 'data2.txt') or die;

  11. my(%hash1, %hash2);

  12. while(<FILE1>){
  13.         chomp;
  14.         @_ = split /[:-]/;
  15.         push(@{$hash1{$_[0]}}, [$_[1], $_[2]]);
  16. }

  17. while(<FILE2>){
  18.         chomp;
  19.         @_ = split /[:-]/;
  20.         push(@{$hash2{$_[0]}}, [$_[1], $_[2]]);
  21. }

  22. close(FILE1);
  23. close(FILE2);

  24. for my $key (keys %hash1){
  25.         while(@{$hash1{$key}}){
  26.                 while(@{$hash2{$key}}){
  27.                         unless(@{$hash1{$key}}){
  28.                                 open(OUTPUT_FILE, '>>data2_diff.txt');
  29.                                 printf OUTPUT_FILE "%s:%d-%d\n", $key, $_->[0], $_->[1] for @{$hash2{$key}};
  30.                                 undef @{$hash2{$key}};
  31.                                 close(OUTPUT_FILE);
  32.                                 last;
  33.                         }
  34.                         my $result = JiaoJi($hash1{$key}[0], $hash2{$key}[0]);
  35.                         if($result == 0){
  36.                                 open(OUTPUT_FILE, '>>data1_diff.txt');
  37.                                 print OUTPUT_FILE "$key:$hash1{$key}[0][0]-$hash1{$key}[0][1]$/";
  38.                                 shift @{$hash1{$key}};
  39.                         }elsif($result == 1){
  40.                                 open(OUTPUT_FILE, '>>data2_diff.txt');
  41.                                 print OUTPUT_FILE "$key:$hash2{$key}[0][0]-$hash2{$key}[0][1]$/";
  42.                                 shift @{$hash2{$key}};
  43.                         }else{
  44.                                 open(OUTPUT_FILE, '>>data_comm.txt');
  45.                                 print OUTPUT_FILE "$key:$hash1{$key}[0][0]-$hash1{$key}[0][1] $hash2{$key}[0][0]-$hash2{$key}[0][1]$/";
  46.                                 shift @{$hash1{$key}};
  47.                                 shift @{$hash2{$key}};
  48.                         }
  49.                         close(OUTPUT_FILE);
  50.                 }
  51.                 open(OUTPUT_FILE, '>>data1_diff.txt');
  52.                 printf OUTPUT_FILE "%s:%d-%d\n", $key, $_->[0], $_->[1] for @{$hash1{$key}};
  53.                 undef @{$hash1{$key}};
  54.                 close(OUTPUT_FILE);
  55.         }
  56. }
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
13 [报告]
发表于 2014-07-28 15:16 |只看该作者
这 ?
小伙伴们, 这是不是正确的 ? {:2_172:}

data1:
range1:3-11
range1:12-20
range1:21-29
range1:31-34
range1:39-41
range1:42-52
range1:54-55
range1:59-63
range1:68-75
range1:78-86
range2:4-11
range2:13-21
range2:23-31
range2:36-45
range2:46-52
range2:55-65
range2:69-70
range2:71-74
range2:77-80
range2:83-86
range3:4-7
range3:9-17
range3:19-21
range3:22-23
range3:25-27
range3:30-32
range3:35-38
range3:40-49
range3:50-58
range3:60-67
range4:2-3
range4:5-11
range4:13-15
range4:18-26
range4:29-36
range4:40-48
range4:49-55
range4:59-62
range4:65-68
range4:70-71
range5:4-14
range5:18-27
range5:29-30
range5:34-37
range5:42-43
range5:48-49
range5:51-60
range5:62-67
range5:70-77
range5:82-84

data2:
range1:1-11
range1:15-22
range1:25-34
range1:37-41
range1:43-47
range1:50-55
range1:60-70
range1:75-83
range1:88-93
range1:98-106
range2:1-5
range2:8-17
range2:21-22
range2:27-30
range2:34-41
range2:42-52
range2:53-55
range2:58-68
range2:71-72
range2:77-87
range3:1-10
range3:11-18
range3:21-30
range3:31-41
range3:46-51
range3:56-58
range3:63-73
range3:74-75
range3:76-80
range3:84-93
range4:1-9
range4:10-19
range4:24-33
range4:36-43
range4:46-51
range4:55-57
range4:60-69
range4:71-78
range4:83-88
range4:92-96
range5:2-3
range5:5-10
range5:15-25
range5:28-35
range5:38-43
range5:47-54
range5:55-65
range5:66-76
range5:77-83
range5:86-96

========

diff1:
range1:68-75
range2:69-70
range3:19-21
range3:30-32
range3:50-58
range4:18-26
range4:49-55
range4:59-62
range4:70-71
range5:34-37
range5:82-84

diff2:
range1:88-93
range1:98-106
range2:1-5
range2:21-22
range2:53-55
range3:56-58
range3:74-75
range3:76-80
range3:84-93
range4:46-51
range4:55-57
range4:71-78
range4:83-88
range4:92-96
range5:2-3
range5:77-83
range5:86-96

com:
range1:3-11 1-11
range1:12-20 15-22
range1:21-29 25-34
range1:31-34 25-34

range1:39-41 37-41
range1:42-52 43-47
range1:54-55 50-55
range1:59-63 60-70
range1:78-86 75-83
range2:4-11 8-17
range2:13-21 8-17

range2:23-31 27-30
range2:36-45 34-41
range2:36-45 42-52
range2:46-52 42-52

range2:55-65 58-68
range2:71-74 71-72
range2:77-80 77-87
range2:83-86 77-87

range3:4-7 1-10
range3:9-17 11-18
range3:22-23 21-30
range3:25-27 21-30

range3:35-38 31-41
range3:40-49 46-51
range3:60-67 63-73
range4:2-3 1-9
range4:5-11 1-9

range4:13-15 10-19
range4:29-36 24-33
range4:40-48 36-43
range4:65-68 60-69
range5:4-14 5-10
range5:18-27 15-25
range5:29-30 28-35
range5:42-43 38-43
range5:48-49 47-54
range5:51-60 47-54
range5:51-60 55-65
range5:62-67 55-65

range5:70-77 66-76



回复 1# newfinder


   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
14 [报告]
发表于 2014-07-28 15:39 |只看该作者
回复 13# pitonas

这是要启动“一夫多妻制”吗?{:2_172:}
   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
15 [报告]
发表于 2014-07-28 15:49 |只看该作者
  1. range5:48-49 47-54
  2. range5:51-60 47-54
  3. range5:51-60 55-65
  4. range5:62-67 55-65
复制代码
3 夫 2 妻 了 ~ {:2_168:}
回复 14# yestreenstars


   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
16 [报告]
发表于 2014-07-28 15:53 |只看该作者
回复 15# pitonas

楼主再不出来澄清就麻烦啦~
   

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
17 [报告]
发表于 2014-08-03 21:05 |只看该作者
我写不出来了

论坛徽章:
0
18 [报告]
发表于 2014-08-05 12:58 |只看该作者
回复 13# pitonas
是的,大侠,不排除有这种情况……

   

论坛徽章:
0
19
发表于 2014-08-05 13:01
回复 16# yestreenstars
先给大侠道个歉,这两天由于出差,外地没网,不能及时看帖子,真的很不好意思……

这个您说的“一夫多妻”制,不排除有这种情况,数据里可能会出现,当时我也没有注意到这一点,还是pitonas想的周到……

   

论坛徽章:
0
20 [报告]
发表于 2014-08-05 13:02 |只看该作者
回复 15# pitonas
先给大侠道个歉,这两天由于出差,外地没网,不能及时看帖子,真的很不好意思……

的确会存在这样的问题,这样也应该算作一种情况,谢谢大侠的提醒……

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP