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