in reply to Help the counting!
As output, I get:my %data; while (<DATA>) { my ($key, $from, $end) = split; if (!$data {$key}) { $data {$key} = [[$from, $end, 1]]; } else { my @new; my $count = 1; foreach my $segment (@{$data{$key}}) { if ($from < $$segment[1] && $end > $$segment[0]) { # # Must overlap, so merge # $from = $$segment[0] if $$segment[0] < $from; $end = $$segment[1] if $$segment[1] > $end; $count += $$segment[2]; } else { # # No overlap. Keep. # push @new, $segment; } } push @new, [$from, $end, $count]; $data{$key} = [sort {$$a[0] <=> $$b[0]} @new]; } } foreach my $key (sort keys %data) { my @segments = @{$data{$key}}; for (my $i = 0; $i < @segments; $i++) { printf "ID_%d %s %d %d %d\n", $i + 1, $key, @{$segmen +ts[$i]}; } } __DATA__ chr1 101 105 X X - chr1 102 108 X X - chr1 106 111 X X - chr1 112 113 X X - chr1 113 115 X X - chr2 114 118 X X - chr2 119 121 X X - chr2 120 123 X X - chr3 125 130 X X - chr3 131 132 X X -
Note this has two ranges from chr3; not 1. I don't see anything spanning the gap from 130 to 131 in your input.ID_1 chr1 101 111 3 ID_2 chr1 112 113 1 ID_3 chr1 113 115 1 ID_1 chr2 114 118 1 ID_2 chr2 119 123 2 ID_1 chr3 125 130 1 ID_2 chr3 131 132 1
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Counting problem!
by g-alone (Initiate) on Mar 22, 2012 at 18:48 UTC | |
by JavaFan (Canon) on Mar 22, 2012 at 19:35 UTC |