use warnings; use strict; my (%sites,%dsks); while () { my ($site, $buf) = split /,/; for (split /:/, $buf) { for my $dsk (grep {$_!=0} /([0-9]+)!([0-9]+)!$/) { $sites{$site}{$dsk}++; $dsks{$dsk}{$site}++; } } } for my $dsk (sort {$a<=>$b} keys %dsks) { print "Dsk $dsk: ", join(", ", sort {$a<=>$b} keys %{ $dsks{$dsk} } ), "\n"; } for my $site (sort {$a<=>$b} keys %sites) { print "Site $site: ", join(", ", sort {$a<=>$b} keys %{ $sites{$site} } ), "\n"; }