#!/usr/bin/perl use strict; my $Usage = "Usage: $0 old_file new_file > union_file\n"; die $Usage unless ( @ARGV == 2 and -f $ARGV[0] and -f $ARGV[1] ); my %union; open IN, $ARGV[0] or die "$ARGV[0]: $!"; while () { chomp; my @flds = split /,/; my $val = pop @flds; # assumes exactly 4 fields in every row my $key = join ',', @flds; $union{$key} = $val; } open IN, $ARGV[1] or die "$ARGV[1]: $!"; while () { chomp; my @flds = split /,/; my $val = pop @flds; my $key = join ',', @flds; next if ( exists( $union{$key} ) and abs(($union{$key} - $val)/$union{$key}) * 100 > 1 ); $union{$key} = $val; } # union is now complete print "$_,$union{$_}\n" for ( sort keys %union );