美文网首页
数据处理时交、并、补、差集的Perl处理脚本

数据处理时交、并、补、差集的Perl处理脚本

作者: BINBINCC | 来源:发表于2020-11-06 15:51 被阅读0次

    面对海量数据要进行交集、并集等基本的统计时我们该怎么做呢?

    一、基本概念

    交集

    交集

    3为A和B的交集

    并集

    并集

    1、2、3、4、5为A和B的并集

    差集

    差集

    1、2、4、5为A和B的差集

    补集

    补集

    二、代码展示

    下面代码只针对两个文件进行相互比较

    #!/usr/bin/perl
    use warnings;
    use strict;
    
    open A,$ARGV[0] or die;
    open B,$ARGV[1] or die;
    
    open UNION,  ">union.txt" or die;
    open INTSEC, ">intsec.txt" or die;
    open DIFF,   ">diff.txt" or die;
    open A_SPEC, ">a_spec.txt" or die;
    open B_SPEC, ">b_spec.txt" or die;
    
    my @a;
    my @b;
    
    while(<A>){
            chomp;
            push @a, $_;
            }
    while(<B>){
            chomp;
            push @b, $_;
            }
    
    
    my @union;#并集
    my @diff;#差集
    my @intsec;#交集
    my @a_spec;#A独有
    my @b_spec;#B独有
    my %union;
    my %diff;
    my %intsec;
    my %a;
    my %b;
    #my (@union,@diff,@intsec,@a_spec,@b_spec,%union,%diff,%intsec,%a,%b);可以同时写到一起
    foreach (@a){$union{$_}++; $a{$_}++;}
    foreach (@b){$union{$_}++; $b{$_}++;} #如果A中的数在B中再次出现的话,则该数所对应的值会自增为2
    
    
    @union = keys %union;
    
    foreach (@union){
            if (exists $a{$_} and $union{$_}==1 ){
                    push @a_spec,$_;
                    }
            elsif($union{$_} == 1 and $b{$_} == 1){
                    push @b_spec,$_;
                    }
            else {push @intsec,$_;}
    }
    @diff = (@a_spec,@b_spec);
    
    print UNION (join "\n",@union);
    print INTSEC (join "\n",@intsec);
    print DIFF (join "\n", @diff);
    print A_SPEC (join "\n", @a_spec);
    print B_SPEC (join "\n", @b_spec);
    
    

    代码有点长,其实可以更简单》》》》》》


    下次见咯( ^ . ^ )

    大家一起学习讨论鸭!

    来一杯!

    相关文章

      网友评论

          本文标题:数据处理时交、并、补、差集的Perl处理脚本

          本文链接:https://www.haomeiwen.com/subject/anmtbktx.html