use strict; use warnings; my %clean_data; chomp (my @data_array = ); for my $data ( @data_array) { my ($server, @info) = split (/,/,$data); $data = \@info; push @{$clean_data{$server}}, $data; } #use Data::Dumper;die Dumper\%clean_data; print $_, $/, map { "\t@$_$/"} @{$clean_data{$_}} for sort keys %clean_data; __DATA__ server_A, Perl, UK server_A, Word, UK server_A, Outlook, UK server_A, Excel, UK server_B, Reuters, NL server_B, TradeXL, NL server_B, Thompsons, NL server_B, Bloomberg, NL server_B, Tibco, NL server_c, BasketLink, USA server_c, Evolution, USA server_c, Lotus, USA server_c, TIB, USA server_A, Python, UK