#! /usr/bin/perl use strict; use warnings; use List::Util qw( first ); my $fileA = "A.txt"; my $fileB = "B.txt"; my $outfile = "C.txt"; my $criteria_size = 20; # be sure you have enough memory for this! my @reference = do { open my $fh, '<', $fileB; <$fh> }; open my $fhout, '>', $outfile or die "open($outfile,w) failed: $!\n"; open my $fhin, '<', $fileA or die "open($fileA,ro) failed: $!\n"; while ( my $lineA = <$fhin> ) { my $critA = substr( $lineA, 0, $criteria_size ); # return first line with matching reference number and leave it in @reference my $lineB = first { substr( $_, 0, $criteria_size ) == $critA } @reference; print $fhout ( $lineB ? $lineB : $lineA ); } close $fhin; close $fhout or die "close($outfile) failed: $!\n";