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"; } #### my %alldsks = map {$_=>1} keys %dsks; for my $site (sort {$a<=>$b} keys %sites) { my @sitedsks = keys %{ $sites{$site} }; my %missingdsks = %alldsks; delete @missingdsks{@sitedsks}; print "Site $site MISSING: ", join(", ", sort {$a<=>$b} keys %missingdsks), "\n"; } __END__ Site 377 MISSING: 70, 71, 90, 91, 92, 93, 189, 190, 204, 205, 206, 207, 550, 551, 554 Site 512 MISSING: 71, 96, 97, 204, 205, 206, 207, 550, 551, 554 Site 587 MISSING: 70, 71, 90, 91, 92, 93, 96, 97, 189, 190, 204, 205, 206, 207 Site 1108 MISSING: 90, 91, 92, 93, 96, 97, 189, 190, 550, 551, 554