in reply to combining two files based on missing values

Your code is actually almost complete. I've updated your code to use some recommended conventions, such as lexical file handles, three argument open, error checking, and the addition of use strict and use warnings (they aren't absolutely necessary but can be very helpful, so are recommended).

#!/usr/bin/perl use strict; use warnings; open my $FH1,"<", "file1.txt" or die "could not open file1.txt: $!"; open my $FH2,"<", "file2.txt" or die "could not open file2.txt: $!"; my @array=<$FH2>; while (my $line1 = <$FH1>) { my @hold; my @coll = split /\s+/, $line1; my $hit=$coll[5]; @hold = grep /$hit/, @array; my $held = shift @hold; if (defined $held) { my @cols = split /\s+/, $held; print join "\t", @cols; print "\n"; } else{ print join "\t", @coll; print "\n"; } }

Update: Hash-based solution

my %lines; read_results("file1.txt"); read_results("file2.txt"); print "$lines{$_}\n" for sort {$a <=> $b} keys %lines; sub read_results { my $fn = shift; open my $FH, "<", $fn or die "couldn't open $fn: $!"; while (my $line = <$FH>) { chomp $line; my ($id) = $line =~ /TAT_(\d+)/; next unless $id; $lines{$id} = $line; } }