免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Perl 取并集
12下一页
最近访问板块 发新帖
查看: 3976 | 回复: 16

取并集 [复制链接]

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2012-11-29 16:04 |显示全部楼层
shell版块的一个问题,想了很长时间 没有好的思路
如何将文本中,含有相同的数的行,求并集后输出

cat test.data
==============================================
1 2
2 3
3 2
4 7 8
5 7
6
7 4 5 8
8 4 7
================================================
想要得到的结果为
cat test.result
================================================
1 2 3
4 5 7 8
6
================================================
结果是这样得到的,第一行是{1,2}{2,3}{3,2}求并集后的结果{1,2,3}
第二行是{4,7,8}{5,7}{7,4,5,8}{7,4,7}求并集的结果{4,5,7,8}
而第三行{6}没有于其他行有交集所以结果为{6}
我的问题是,如果把所有含有相同数的行求并集后列出来
=================================================
如果是这样的
1 2
4 5
1 5
合并的结果为
1 2 4 5



请大家给个思路....

论坛徽章:
1
2015亚冠之阿尔纳斯尔
日期:2015-11-11 18:05:28
发表于 2012-11-29 16:24 |显示全部楼层
本帖最后由 kaixin9ok 于 2012-11-29 17:28 编辑




论坛徽章:
1
2015亚冠之阿尔纳斯尔
日期:2015-11-11 18:05:28
发表于 2012-11-29 16:27 |显示全部楼层
本帖最后由 kaixin9ok 于 2012-11-29 17:28 编辑

回复 2# kaixin9ok


  

论坛徽章:
0
发表于 2012-11-29 17:55 |显示全部楼层
回复 1# mcshell
如果是
1 2
2 3
3 4
4 5
这种呢?



   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2012-11-29 19:27 |显示全部楼层
回复 4# cecial


    12345

论坛徽章:
0
发表于 2012-11-29 21:15 |显示全部楼层
回复 1# mcshell


    需求无奇不有啊,我来抛个砖
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my @stack = ();
  6. while (<DATA>) {
  7.     my @numbers = split;
  8.     push @stack, [ @numbers ] and next unless @stack;
  9.     my $is_not_uniq = 1;
  10.     foreach my $i (0..$#stack) {
  11.         my (%m,%n);
  12.         $m{$_}++ && $n{$_}++ for @{$stack[$i]}, @numbers;
  13.         if (%n) {
  14.             # find some uniq numbers
  15.             # so, update this array list
  16.             $stack[$i] = [ sort {$a <=> $b} keys %m ];
  17.             $is_not_uniq = 0;
  18.             last;
  19.         }
  20.     }
  21.     push @stack, [ @numbers ] if $is_not_uniq;
  22. }

  23. print Dumper \@stack;

  24. __DATA__
  25. 1 2
  26. 2 3
  27. 3 2
  28. 4 7 8
  29. 5 7
  30. 6
  31. 7 4 5 8
  32. 8 4 7
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2012-11-29 21:50 |显示全部楼层
回复 6# kk861123


    顶眼镜哥,每次都是你帮忙

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2012-11-29 21:55 |显示全部楼层
回复 6# kk861123


    能否讲下思路 ,授之以渔~~

论坛徽章:
0
发表于 2012-11-29 22:03 |显示全部楼层
回复 8# mcshell


   好,思路就是没读取一行都与@stack中的各组进行重组,当然是发现有重复的内容才会重组。
%m 用于获取并集, %n用于获取交集。

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2012-11-29 22:06 |显示全部楼层
回复 9# kk861123


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP