#!perl use strict; use warnings; use Text::CSV qw( csv ); my $magic_column = 3; #0-indexed my $aoa = csv( in => $ARGV[0] ); my %uniq = (); my $head = shift @$aoa; foreach my $line (@$aoa) { my $key = join( ',', @{$line}[ 0 .. $magic_column - 1 ] ); my $suffix = join( ',', @{$line}[ $magic_column + 1 .. $#$line ] ); $uniq{$key} //= [ [], $suffix ]; push @{ $uniq{$key}[0] }, $line->[$magic_column]; } print join( ',', @$head ), "\n"; foreach my $line ( sort { lc $a cmp lc $b } keys %uniq ) { my $magic = join( ',', sort { lc $a cmp lc $b } @{ $uniq{$line}[0] } ); if ( @{ $uniq{$line}[0] } > 1 ) { $magic = '"' . $magic . '"'; } print $line, ',', $magic, ',', $uniq{$line}[1], "\n"; }