use strict; use warnings; my %siteInfo; while () { chomp; my @parts = split; my $site = ($siteInfo{"Site$."} = {}); @{$site}{qw(region country city)} = @parts; $site->{totalS5s} = $site->{totalVulns} = ++$site->{totalDevices}; } my @sorted = sort { my $siteA = $siteInfo{$a}; my $siteB = $siteInfo{$b}; $siteA->{region} cmp $siteB->{region} or $siteA->{country} cmp $siteB->{country} or $siteA->{city} cmp $siteB->{city} } keys %siteInfo; for my $site1 (@sorted) { my $site = $siteInfo{$site1}; print "$site->{region},$site->{country},$site1,$site->{totalDevices}, ,$site->{totalVulns},$site->{totalS5s}\n"; } __DATA__ ...