perl, v5.8.0 built for MSWin32-x86-multi-thread #### #!/usr/bin/perl use strict; use warnings; sub dump_ref { use Data::Dumper; $Data::Dumper::Terse = 1; $Data::Dumper::Indent = ((ref $_[0]) =~ /ARRAY/i)?0:1; $Data::Dumper::Sortkeys = sub{no warnings; return [ sort{$a<=>$b || $a cmp $b} keys %{$_[0]} ]; use warnings;}; $_[1] = "Var" if(!defined $_[1]); print "$_[1] = \n"; print Dumper($_[0]); print "\n"; } #### my @array1 = (1 .. 20); my @array2 = (10 .. 30); my @array3 = (19 .. 40); my @unique_numbers = do{ local %_; undef @_{@array1, @array2, @array3}; sort {$a<=>$b} keys %_; }; dump_ref(\@unique_numbers, '@unique_numbers'); __OUTPUT__ @unique_numbers = ['1','2','3','4','5','6','7','8','9','10', '11','12','13','14','15','16','17','18','19','20', '21','22','23','24','25','26','27','28','29','30', '31','32','33','34','35','36','37','38','39','40'] #### my %unique_sets; push @{$unique_sets{$_}},$_ for(@array1, @array2, @array3); dump_ref(\%unique_sets, '%unique_sets'); __OUTPUT__ %unique_sets = { '1' => [1], '2' => [2], '3' => [3], '4' => [4], '5' => [5], '6' => [6], '7' => [7], '8' => [8], '9' => [9], '10' => [10,10], '11' => [11,11], '12' => [12,12], '13' => [13,13], '14' => [14,14], '15' => [15,15], '16' => [16,16], '17' => [17,17], '18' => [18,18], '19' => [19,19,19], '20' => [20,20,20], '21' => [21,21], '22' => [22,22], '23' => [23,23], '24' => [24,24], '25' => [25,25], '26' => [26,26], '27' => [27,27], '28' => [28,28], '29' => [29,29], '30' => [30,30], '31' => [31], '32' => [32], '33' => [33], '34' => [34], '35' => [35], '36' => [36], '37' => [37], '38' => [38], '39' => [39], '40' => [40] } #### my %unique_counts = do{ local %_; $_{$_}++ for(@array1, @array2, @array3); %_; }; dump_ref(\%unique_counts, '%unique_counts'); __OUTPUT__ %unique_counts = { '1' => 1, '2' => 1, '3' => 1, '4' => 1, '5' => 1, '6' => 1, '7' => 1, '8' => 1, '9' => 1, '10' => 2, '11' => 2, '12' => 2, '13' => 2, '14' => 2, '15' => 2, '16' => 2, '17' => 2, '18' => 2, '19' => 3, '20' => 3, '21' => 2, '22' => 2, '23' => 2, '24' => 2, '25' => 2, '26' => 2, '27' => 2, '28' => 2, '29' => 2, '30' => 2, '31' => 1, '32' => 1, '33' => 1, '34' => 1, '35' => 1, '36' => 1, '37' => 1, '38' => 1, '39' => 1, '40' => 1 } #### my %duplicates = do{ local %_; $_{$_}++ for(@array1, @array2, @array3); delete @_{ (map{ ($_{$_}==1) ? $_ : () ; } keys %_ ) }; %_; }; dump_ref(\%duplicates, '%duplicates'); __OUTPUT__ %duplicates = { '10' => 2, '11' => 2, '12' => 2, '13' => 2, '14' => 2, '15' => 2, '16' => 2, '17' => 2, '18' => 2, '19' => 3, '20' => 3, '21' => 2, '22' => 2, '23' => 2, '24' => 2, '25' => 2, '26' => 2, '27' => 2, '28' => 2, '29' => 2, '30' => 2 } #### my %non_duplicates = do{ local %_; $_{$_}++ for(@array1, @array2, @array3); delete @_{ (map{ ($_{$_}>1) ? $_ : () ; } keys %_ ) }; %_; }; dump_ref(\%non_duplicates, '%non_duplicates'); __OUTPUT__ %non_duplicates = { '1' => 1, '2' => 1, '3' => 1, '4' => 1, '5' => 1, '6' => 1, '7' => 1, '8' => 1, '9' => 1, '31' => 1, '32' => 1, '33' => 1, '34' => 1, '35' => 1, '36' => 1, '37' => 1, '38' => 1, '39' => 1, '40' => 1 } #### my %unique_descriptive = do { local %_; for(@array1, @array2, @array3){ $_{$_}->{count}++ ; push @{$_{$_}->{values}},$_; } %_; }; dump_ref(\%unique_descriptive, '%unique_descriptive'); __OUTPUT__ %unique_descriptive = { '1' => { 'count' => 1, 'values' => [1] }, '2' => { 'count' => 1, 'values' => [2] }, ...clipped for brevity... '11' => { 'count' => 2, 'values' => [11,11] }, '12' => { 'count' => 2, 'values' => [12,12] }, ...clipped for brevity... '19' => { 'count' => 3, 'values' => [19,19,19] }, '20' => { 'count' => 3, 'values' => [20,20,20] }, '21' => { 'count' => 2, 'values' => [21,21] }, ...clipped for brevity... '40' => { 'count' => 1, 'values' => [40] } } #### my %max = do{ local %_ = %unique_descriptive; %{ shift @{[ map{$_->[2]} sort{$b->[0] <=> $a->[0] || $b->[1] <=> $a->[1]} map{[$_{$_}->{count}, $_, $_{$_}]} keys %_ ]} }; }; dump_ref(\%max,'%max'); __OUTPUT__ %max = { 'count' => 3, 'values' => [20,20,20] } #### my %min = do{ local %_ = %unique_descriptive; %{$_{shift @{[ sort{ $_{$a}->{count} <=> $_{$b}->{count} || $b <=> $a} keys %_ ]}}}; }; dump_ref(\%min,'%min'); __OUTPUT__ %min = { 'count' => 1, 'values' => [40] } #### shift @{[ map{$_->[2]} sort{$a->[0] <=> $b->[0] || $a->[1] <=> $b->[1]} map{[$_{$_}->{count}, $_, $_{$_}]} keys %_ ]} #### ... = do { local %_ = %unique_descriptive; %{$_{shift @{[ sort{ $_{$a}->{count} <=> $_{$b}->{count} || $b <=> $a} keys %_ ]}}}; }; #### #!/usr/bin/perl -w use strict; my %d = map{ #cleanup the line chomp; #does it match /^([\d\.]+) \w+/ ? ($1, $_) : (); }map{ #use @ARGV and <> magic to #read in each line from each file. local @ARGV = ($_); <>; }; #glob in all files that match open(OUTPUT, ">unique.dat") or die "a horrible death... $!"; print OUTPUT, $d{$_}."\n" for(sort keys %d); close OUTPUT;