#!/usr/bin/perl use strict; use warnings; my @keys; my %vals; while () { 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 #### id1 name1 cat1:catname1, cat2:catname2 id2 name2 cat3:catname3 id3 name3 cat1:catname1, cat4:catname4