a 11-23 b 33-39 c 40-45 d 48-58
1-34 35-39 40-42 43-49 51-59 62-90
And got the following result:
a 11-23 b 33-34 b 35-39 c 40-42 c 43-45 d 48-49 d 51-58
from the following code:
#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use constant { FROM => 0, TO => 1, NAME => 2, }; my @ranges; open my $F1, '<', shift or die $!; while (<$F1>) { my ($name, $range) = split; my ($from, $to) = split /-/, $range; push @ranges, [$from, $to, $name]; } my $range_idx = 0; open my $F2, '<',shift or die $!; while (<$F2>) { chomp; my ($from, $to) = split /-/; my $end; do { ++$range_idx until $range_idx > $#ranges || $ranges[$range_idx][FROM] <= $to && $ranges[$range_idx][TO] >= $from; last if $range_idx > $#ranges; my $start = $from > $ranges[$range_idx][FROM] ? $from : $ranges[$range_idx][FROM]; $end = $to > $ranges[$range_idx][TO] ? $ranges[$range_idx][TO] : $to; say $ranges[$range_idx][NAME], " $start-$end"; } while $to > ($from = 1 + $end); }
Explanation: @ranges is an array of arrays, it stores the ranges from the first file. While processing the second file, you remember the last range(1) used ( $range_idx ) and for input ranges(2) spreading over more than one range(1), you adjust the $from and try again.
Joining the b's and c's left as an exercise for the reader :-)
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
In reply to Re: finding intermediate range values from two file columns
by choroba
in thread finding intermediate range values from two file columns
by utpalmtbi
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |