#usr/bin/perl -w use strict; use Data::Dump qw(pp); open (my $fileReg, '<', 'chromfile1.txt') or die "unable to open chromfile1.txt $!\n"; open (my $fileBase, '<', 'chromfile2.txt') or die "unable to open chromfile2.txt $!\n"; my %region; while (<$fileBase>) { chomp; my ($chr, $base) = (split)[0,1]; push @{$region{$chr}}, [$base, $_]; } close $fileBase; my %seen; while (my $regionline = <$fileReg>) { chomp ($regionline); my ($base,$start,$end)= (split(/\s+/,$regionline))[0,1,2]; next if $seen{"$base-$start-$end"}++; next if !defined $region{$base}; foreach my $ptr (@{$region{$base}}) { print "$regionline $ptr->[1]\n" if ($ptr->[0]>= $start and $ptr->[0]<=$end); } } __END__ prints: chr1 100 159 0 chr1 104 104 0 0 + chr1 100 159 0 chr1 145 145 0 0 + chr1 200 260 0 chr1 205 205 0 0 + chr1 500 750 0 chr1 600 600 0 0 + chr3 450 700 0 chr3 500 500 0 0 + chr4 100 300 0 chr4 150 150 0 0 + chr4 100 300 0 chr4 175 175 0 0 + chr7 350 600 0 chr7 400 400 0 0 + chr7 350 600 0 chr7 550 550 0 0 + chr9 100 125 0 chr9 100 100 0 0 + chr11 679 687 0 chr11 680 680 0 0 + chr11 679 687 0 chr11 681 681 0 0 + chr22 100 200 0 chr22 105 105 0 0 + chr22 100 200 0 chr22 110 110 0 0 + chr22 300 400 0 chr22 350 350 0 0 + file1: chr1 100 159 0 chr1 100 159 0 chr1 200 260 0 chr1 500 750 0 chr3 450 700 0 chr4 100 300 0 chr4 100 300 0 chr7 350 600 0 chr7 350 600 0 chr9 100 125 0 chr11 679 687 0 chr11 679 687 0 chr22 100 200 0 chr22 100 200 0 chr22 300 400 0 file2: chr1 104 104 0 0 + chr1 145 145 0 0 + chr1 205 205 0 0 + chr1 600 600 0 0 + chr3 500 500 0 0 + chr4 150 150 0 0 + chr4 175 175 0 0 + chr7 400 400 0 0 + chr7 550 550 0 0 + chr9 100 100 0 0 + chr11 680 680 0 0 + chr11 681 681 0 0 + chr22 105 105 0 0 + chr22 110 110 0 0 + chr22 350 350 0 0 +