my $margin = 500; open my $SC, "<", $file2 or die "Error: could not open $file2 $!"; my %result; my $step = 100; while (my $line2 = <$SC>) { my ($id, $val) = split /\t/, $line2; my $val_file1 = $hash{$id}; my ($low, $high) = ( $val_file1 - $margin, $val_file1 + $margin); next unless $val > $low and $val < $high; # value not within range, just discard it my $delta = int (($val - $low)/$step); # delta : slot number $result{$id}{$delta}++; } close $SC; # now %result has, for each $ID, a frequency distribution by steps of 100 (slots 0 to 9), we just need to extract the data from it. for my $id (keys %result) { my $low = $hash{$id} - $margin; for my $slot (0..9){ my $range = sprintf "%d-%d", $low + $slot * $step, $low + ($slot + 1) * $step; my $frequency = $result{$id}{$slot} // 0; print "ID $id: $range : $frequency \n"; } }