#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; my %changes; for my $file (@ARGV) { open my $in, '<', $file or die "$file: $!"; while (<$in>) { chomp; my ($id, $intervals_string) = split /: /; my @intervals = map [ split /-/ ], split /, /, $intervals_string; for my $interval (@intervals) { my ($from, $to) = @$interval; $changes{$from}{$id}{$file} = 'start'; $changes{$to}{$id}{$file} = 'end'; } } } my %current; my %intervals; for my $point (sort { $a <=> $b } keys %changes) { for my $id (keys %{ $changes{$point} }) { for my $file (keys %{ $changes{$point}{$id} }) { if ('start' eq $changes{$point}{$id}{$file}) { $current{$id}{$file} = 1; push @{ $intervals{$id} }, [$point] if @ARGV == keys %{ $current{$id} }; } else { $intervals{$id}[-1][1] = $point if @ARGV == keys %{ $current{$id} }; delete $current{$id}{$file}; delete $current{$id} if ! keys %{ $current{$id} }; } } } } for my $id (keys %intervals) { say "$id: ", join ', ', map "$_->[0]-$_->[1]", @{ $intervals{$id} }; }