One potential alternative, ensuring keys stay in the same order:
#!/usr/bin/perl
use strict;
use warnings;
my @keys;
my %vals;
while (<DATA>) {
chomp;
my @data = split;
my $key = join ' ', splice @data, 0, 2;
push @keys, $key if !$vals{$key};
push @{$vals{$key}}, join ':', @data;
}
for (@keys) {
print "$_ " . join(', ', @{$vals{$_}}) . "\n";
}
__DATA__
id1 name1 cat1 catname1
id1 name1 cat2 catname2
id2 name2 cat3 catname3
id3 name3 cat1 catname1
id3 name3 cat4 catname4
Outputs:
id1 name1 cat1:catname1, cat2:catname2
id2 name2 cat3:catname3
id3 name3 cat1:catname1, cat4:catname4
- Miller