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"; }