use warnings; use strict; my %hash; while (){ chomp; my ($key, $val, $colour) = split; push @{ $hash{$key}{$val} }, $colour; } for my $k (keys %hash){ for (keys %{ $hash{$k} }){ my $colours = join ':', @{ $hash{$k}{$_} }; print "$k $_ $colours\n"; } } __DATA__ A1 abc yellow B1 xyz green A2 cde red A1 abc green A2 cde yellow A1 abc blue #### A1 abc yellow:green:blue A2 cde red:yellow B1 xyz green