#!/usr/bin/perl -w use strict; my %H; while () { /^(\d\d\d)-(\d\d\d),(\w\w),(.*)/ or die "Can't parse $_"; push @{$H{$1}{$3}{head}}, $2; push @{$H{$1}{$3}{tail}}, grep{$_} split ':', $4; } foreach my $k1 (sort {$a <=> $b} keys %H) { print "$k1\n"; foreach my $k2 (sort {$a <=> $b} keys %{$H{$k1}}) { print "$k2\n"; my $tail = join ':', sort {$a <=> $b} @{$H{$k1}{$k2}{tail}}; foreach my $head (sort {$a <=> $b} @{$H{$k1}{$k2}{head}}) { print "$head|$tail\n"; } } } __DATA__ 100-233,MA,150:250 100-344,MA,350: 200-400,ER, 200-300,ER,576