my %types; while () { chop; m/(.*)\s([^\s]+)$/ or next; push @{$types{$2}}, $1; } foreach my $type (keys %types) { print "$type\n"; print "$_\n" for @{$types{$type}}; } __DATA__ name1 1 2 3 4 typex name2 3 4 5 6 typey name3 2 3 3 1 typex name4 5 3 4 2 typez name5 9 8 2 1 typea