use strict; use warnings; use Data::Dumper; my @columns_duplicates = ( [qw[1 2 3 2 4 4]], [qw[a b c b d d]], [qw[x y z y u u]] ); print Dumper \@columns_duplicates; my @columns_unique = do { my %seen; my @rows = grep { my $row = $_; not $seen{ join "\0", map { $_->[$row] } @columns_duplicates }++ } $[ .. $#{$columns_duplicates[0]}; map { [ @$_[@rows] ] } @columns_duplicates; }; print Dumper \@columns_unique;