$ echo "host1:group1:9001:user1,user2,user3,user4,user5 host1:group2:9002:user1,user2,user3 host1:group3:9003:user1,user2,user4 host1:group4:9004:user1,user2,user5 host1:group5:9005:user1,user2 host1:group6:9006: host2:group1:9001:user1,user2,user3,user4,user5 host2:group2:9002:user1,user2,user3 host2:group3:9003:user1,user2,user4 host2:group4:9004:user1,user2,user5 host2:group5:9005:user1,user2 host2:group1:9006: host3:group1:9001:user1,user2,user3,user4,user5 host3:group2:9002:user1,user2,user3 host3:group3:9003:user1,user2,user4 host3:group4:9004:user1,user2,user5 host3:group5:9005:user1,user2 host3:group1:9006:" | perl -e' use strict; use warnings; my %table; while ( <> ) { chomp; my ( $host, $grp, $gid, $userid ) = split /:/; my $group = "$grp:$gid"; $table{ $group }{ $userid } = 1; } for my $group ( sort keys %table ) { print "$group:"; my @users = sort keys %{ $table{ $group } }; print join( ",", @users ), "\n"; } ' group1:9001:user1,user2,user3,user4,user5 group1:9006: group2:9002:user1,user2,user3 group3:9003:user1,user2,user4 group4:9004:user1,user2,user5 group5:9005:user1,user2 group6:9006: