use strict; use warnings; my %data; while () { my ($id, $location, $info) = /^((?:[^,]*,){2})([^,]*),(.*)$/; push @{$data{$location}}, "$id$info"; #Array of user entries for each location } for (sort keys %data) { print "Location $_:\n "; print join "\n ", @{$data{$_}}; print "\n"; } __DATA__ Login,Name1,Location1,Info,Info2,Infoblah Login,Name2,Location1,Info,Info2,Infoblah Login,Name3,Location2,Info,Info2,Infoblah Login,Name4,Location2,Info,Info2,Infoblah #### Location Location1: Login,Name1,Info,Info2,Infoblah Login,Name2,Info,Info2,Infoblah Location Location2: Login,Name3,Info,Info2,Infoblah Login,Name4,Info,Info2,Infoblah