#!/usr/bin/perl use strict; use warnings; use Sort::Naturally qw/ nsort /; use List::Util qw / max /; @ARGV = qw/ 148N.txt 162N.txt 174N.txt 175N.txt /; my %data; while (<>) { my ($chr, @start_stop) = split; push @{ $data{$chr} }, \@start_stop; } for my $chr (nsort keys %data) { my ($first, @in_order) = sort {$a->[0] <=> $b->[0]} @{ $data{$chr} }; my ($lo, $hi) = @$first; my $merged; for my $aref (@in_order) { # array reference my ($start, $stop) = @$aref; if ($start <= $hi) { $hi = max $hi, $stop; $merged++; } else { printf "%s %s %s merged: %s\n", $chr, $lo, $hi, $merged + 1 if $merged; #print "$chr $lo $hi\n" if $merged; ($lo, $hi) = ($start, $stop); $merged = 0; } } printf "%s %s %s merged: %s\n", $chr, $lo, $hi, $merged + 1 if $merged; #print "$chr $lo $hi\n" if $merged; }