use strict; use warnings; my %logger; my $key; while(){ s/\s+$//; if(/\[(.*)\]/){ $key = $1; }else{push @{$logger{$key}}, $_;} } print $_,":", join ("," => @{$logger{$_}}),$/ for sort {$a cmp $b} keys %logger; __DATA__ [server1] /tmp/location1/file.log /tmp/location2/file.log [server2] /usr/loc1/file.log /usr/loc2/file.log [server3] /citrix/dir3/file.log