use warnings; use strict; my %data; my %ids; while () { chomp; my ($rid, $start, $end) = split; push @{$data{$rid}}, [$start, $end]; @ids{$start, $end} = (); } my @idList = sort {$a <=> $b} keys %ids; for my $rid (keys %data) { my @pairs = @{$data{$rid}}; my %fields; $data{$rid} = []; @fields{grep exists $ids{$_}, $_->[0] .. $_->[1]} = () for @pairs; @{$data{$rid}} = map {exists $fields{$_}} @idList; } my $format = '%-3s' . ('%3d ' x keys %ids) . "\n"; printf $format, 'ID', sort {$a <=> $b} keys %ids; printf $format, $_, @{$data{$_}} for sort keys %data; __DATA__ A 1 2 A 7 10 A 15 20 B 3 5 B 11 15 C 5 10 D 10 20