美文网首页
数据处理时交、并、补、差集的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