#!/usr/bin/perl -w use strict; use warnings; use 5.010; my $size = scalar @ARGV; if ($size < 2) { die "The comparison is impossible, a minimum of two files to compare is required!\nPlease provide an acceptable number of files!\n"; } print "Please specify an output file:\n"; chomp (my $outfile = ); open(OUTFILE, ">$outfile") or die "Could not open $outfile: $!\n"; $_="1"; print "Please specify a file name if you request the list of compared item to be outputed in this file, otherwise state no:\n"; chomp (my $list_requested = ); my $scalar; my $compare; foreach my $arg (@ARGV) { ($scalar, $compare) = &process_file ($arg); } my %scalar = %{$scalar}; my %compare = %{$compare}; print "\nThe comparison was performed on $size files!\n"; unless ($list_requested eq "no") { open(OVERLAP_LIST, ">$list_requested") or die "Could not open $list_requested: $!\n"; $_="1"; print OVERLAP_LIST "Compared items\tFlag\tFiles\n"; foreach my $key (sort keys %compare) { print OVERLAP_LIST "$key\t$compare{$key}{flag}\t$compare{$key}{flag_code}\n"; $key = (); } close (OVERLAP_LIST); } my %compare_bis; foreach my $keys (sort keys %compare) { $compare_bis{$keys} = $compare{$keys}{flag}; } foreach my $key (values %compare_bis) { $scalar{$key}{count}++; } print OUTFILE "Flag\tFlag code\tCount\n"; foreach my $keys (sort {$a <=> $b} keys %scalar) { print OUTFILE "$keys\t$scalar{$keys}{flag_code}\t$scalar{$keys}{count}\n"; } close (OUTFILE); print "\nNOTE TO USER: your files must not have headers and no duplicate values, and must consist of a single column!\nIf this is not the case modify your files in accordance or use another perl script!\n"; ############### # Sub-routine # ############### sub process_file { my $file = $_[0]; open(FILE,"<$file") or die "Could not open $file: $!\n"; $_="1"; my @file = ; close (FILE); state $i = -1; $i += 1; my $score = 2**$i; state %scalar; state %compare; $scalar{-$score}{flag_code} = "Total $file"; $scalar{-$score}{count} = scalar @file; foreach my $entry (@file) { chomp($entry); unless (exists $compare{$entry}) { $compare{$entry}{flag} = $score; $compare{$entry}{flag_code} = "$file"; } else { $compare{$entry}{flag} += $score; $compare{$entry}{flag_code} = join (", ", $compare{$entry}{flag_code}, $file); } my $flag = $compare{$entry}{flag}; my $flag_code = $compare{$entry}{flag_code}; unless (exists $scalar{$flag}) { $scalar{$flag}{flag_code} = $flag_code; $scalar{$flag}{count} = 0; } } return (\%scalar, \%compare); } __END__