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 #### typea name5 9 8 2 1 typex name1 1 2 3 4 name3 2 3 3 1 typey name2 3 4 5 6 typez name4 5 3 4 2 #### typex ...... typey ..... typea ..... typez ...... #### while () { my @fields = split; my $key = pop @fields; my $line = [@fields]; push @{$data{$key}}, $line; } close TEMP; foreach my $key (sort keys %data); { print "$key\n"; my @lines = @{$data{$key}}; # list of lines, from hash foreach my $line (@lines); { my @fields = @$line; print "%s %d %d %d %s" @fields; } print "\n"; }