免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1411 | 回复: 7
打印 上一主题 下一主题

[文本处理] 求2个数组的交集 $m{$_}++ && $n{$_}++; [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-07 01:35 |只看该作者 |倒序浏览
求2个数组之间的交集,方法采纳http://bbs.chinaunix.net/thread-1800151-1-1.html

发现结果不太对

程序如下:(这是我程序的缩略版本)
#!usr/bin/perl -w
use strict;

my (@a,@b,@c,$info,@out1,@out2,@set,@array);
open IN,"a.txt";
while (<IN>){
        chomp;
        @a=split;
        $info=join("\t",$a[0],$a[1],$a[2]);
        push (@set,$info);
}


foreach my $s(@set){
        chomp $s;
        @array=split /\t/,$s;

        open IN1,"b.txt";
        while (<IN1>){
                chomp;
                @b=split;
                if ($b[0] eq $array[0] && $b[1] < $array[2] && $b[2] > $array[1]){push (@out1,$s);}
        }

        open IN2,"c.txt";
        while (<IN2>){
                chomp;
                @c=split;
                if ($c[0] eq $array[0] && $c[1] < $array[2] && $c[2] > $array[1]){push (@out2,$s);}
        }

}

my %m;my %n;my @aa;
for(@out1,@out2){
$m{$_}++ && $n{$_}++;
}
@aa=keys %n;
foreach my $a(@aa)
{print "$a\n";}



输入文件
a.txt
a       501     800


cat b.txt
b       501     800


c.txt
a       401     700
a       701     900


输出:a       501     800

@out2为空
@out1的内容为重复的2行  a       501     800 ,为何按照这个方法取交集,会输出结果呢?劳烦各位大神们指点一二。


论坛徽章:
0
2 [报告]
发表于 2016-09-07 01:35 |只看该作者
不小心发到shell版块了

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2016-09-07 08:08 |只看该作者
回复 1# 静女,其姝

你想输出什么?

论坛徽章:
0
4 [报告]
发表于 2016-09-07 09:58 来自手机 |只看该作者
yinyuemi 发表于 2016-09-07 08:08
回复 1# 静女,其姝

你想输出什么?

这是我程序的简化版本,在a.txt上,取b.txt和c.txt的交集。条件是,b.txt或c.txt的第一列得和a.txt的第一列相同,且第二三列得和a.txt的第二三列有重合的区间

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
5 [报告]
发表于 2016-09-07 10:05 |只看该作者
  1. perl -e 'BEGIN{@a=(1..5);@b=qw/6 2 7 1 5 8 9/}{for(@a,@b){$C{$_}++?push(@I,$_):push(@U,$_)}}END{print "@I\n@U\n"}'
复制代码

论坛徽章:
0
6 [报告]
发表于 2016-09-07 10:23 |只看该作者
回复 5# sunzhiguolu
问题已解决,perl -e 'BEGIN{@a=(1..5);@b=qw/6 2 7 1 5 8 9 9/}{for(@a,@b){$C{$_}++?push(@I,$_):push(@U,$_)}}END{print "@I\n@U\n"}'
交集会出现9


论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2016-09-07 10:28 |只看该作者
本帖最后由 sunzhiguolu 于 2016-09-07 10:38 编辑

回复 6# 静女,其姝
那就费点事
  1. perl -e 'BEGIN{@a=(1..5);@b=qw/6 2 7 1 5 8 9 9/}{@b=grep{!$U{$_}++}@b;for(@a,@b){$C{$_}++?push(@I,$_):push(@U,$_)}}END{print "@I\n@U\n"}'
复制代码



论坛徽章:
0
8 [报告]
发表于 2016-09-07 10:55 |只看该作者
回复 7# sunzhiguolu

多谢了,解决了我的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP