use strict; use warnings; open my $controlFileHandle,'<','control.csv'; my ($file1, $file2, $file3) = qw/file1.csv file2.csv file3.csv/; my (%output, %filepointers,$ofh,$infile,$line,$account,$accountline ); while ($accountline = <$controlFileHandle>) { $account = (split /,/,$accountline,2)[0]; lookForAccountInFile($account,$file1); lookForAccountInFile($account,$file2); lookForAccountInFile($account,$file3); } foreach $infile (keys %output) { open $ofh,'>',"new_$infile"; foreach $line (@{$output{$infile}}) { print $ofh $line } close $ofh; } sub lookForAccountInFile { my ($account,$file) = @_; open my $ifh,'<',$file; if (defined $filepointers{$file}) { seek $ifh, $filepointers{$file}, 0 } my $found = 0; while (my $line = <$ifh>) { last if ($line eq "\n"); my $la = (split /,/,$line,2)[0]; last if ($la > $account); if ($la == $account) { push @{$output{$file}},$line; $found = 1; } $filepointers{$file} = tell($ifh); last if ($found); } } #### Data: control.csv: 1,control,record,1 2,control,khrecord,2 5,control,recordi,5 7,control,record,7 file1.csv: 1,file,1,record,1 2,file,1,record,2 3,file,1,record,3 file2.csv: 2,record,1,file,2 4,record,2,file,2 5,record,3,file,2 6,record,4,file,2 7,record,5,file,2 file3.csv: 4,file,3,record,4 5,file,3,record,5