use warnings; use strict; use Data::Dumper; my %data; while(){ my ($server_name,$fault) = (split/:|\s+/,$_)[0,2]; $data{$server_name}{$fault}++; } print Dumper \%data; __DATA__ Server1:london:network_interface Server1:london:diskspace Server1:london:diskpace Server1:london:kernel Server2:paris:diskspace Server3:new_york:Kernel Server3:new_york:diskspace Server3:new_york:diskspace Server3:new_york:kernel #### $VAR1 = { 'Server3' => { 'kernel' => 1, 'diskspace' => 2, 'Kernel' => 1 }, 'Server1' => { 'kernel' => 1, 'diskpace' => 1, 'diskspace' => 1, 'network_interface' => 1 }, 'Server2' => { 'diskspace' => 1 } };