#! perl use strict; use warnings; use constant LIMIT => 2; my %cats; while () { my ($value, $key) = split; push @{ $cats{$key} }, $value; } for my $key (sort keys %cats) { my @vals = @{ $cats{$key} }; while (@vals) { print $key; my $count = 0; while (@vals && ++$count <= LIMIT) { print ' ', shift @vals; } print "\n"; } } __DATA__ 1 cat1 2 cat1 3 cat2 4 cat3 5 cat3 6 cat1 7 cat1