use strict ; use warnings ; my %initial = () ; my %seen = () ; # increment if animal is seen my $new_value ; # Load initial values open FILE, '<', 'file1.txt' or die 'Failed to open file1' ; while ( my $line = ) { my ($animal, $count ) = split " ", $line ; $initial{$animal}=$count ; } close FILE ; # Open file to look for new animals open UPDATE , '<', 'file2.txt' or die 'Failed to open file2' ; while ( my $line = ) { # We assume a special pattern form your example file my $animal = $1 if $line =~ m/^(\w+) feed/ ; $seen{$animal}++ ; } close UPDATE ; # Open result file for writing open FILE, '>','file1.txt' or die 'Failed to open file1 for writing'; foreach ( sort keys %initial) { #Deal with the three possible case : #new animal, previously existing but unseen, or existing and seen if ( defined $seen{$_} and not defined $initial{$_} ) { $new_value = 1 } elsif ( not defined $seen{$_} and defined $initial{$_} ) { $new_value = $initial{$_} } else { $new_value = $initial{$_} + 1 } print FILE "$_ $new_value\n" ; } close FILE ;