Perl à la rescousse!
perl -lane '
push @{ $c[$_] }, $F[$_] for 0 .. $#F;
}{
for (@c) {
$s = join "|", @$_;
$seen{$s}++ or push @r, $_;
}
print join " ", map shift @$_, @r while @{ $r[0] }
' -- inputfile
La première ligne pivote l'entrée, à savoir qu'il crée la structure suivante:
@c = ([ 'A', 'A', 'A' ],
[ 'B', 'C', 'A' ],
[ 'C', 'B', 'A' ],
[ 'B', 'C', 'A' ]);
Le }{
(appelé « salutation esquimau ») sépare la piste de code pour chaque ligne à partir du code exécuté après le toute l'entrée a été traitée. Il marche le tableau de @c et ne conserve que les colonnes uniques (en créant une chaîne de chacun d'eux comme A|A|A
, B|C|A
, etc., et de les stocker dans le
hachage %seen
. La structure sera
@r = ([ 'A', 'A', 'A' ],
[ 'B', 'C', 'A' ],
[ 'C', 'B', 'A' ]);
et le hachage ressemblera
%seen = ('B|C|A' => 2,
'A|A|A' => 1,
'C|B|A' => 1
);
la dernière impression se déplace le premier élément de chaque colonne, à savoir qu'il pivote en arrière le résultat.
Si les colonnes doivent être uniformes, la dernière colonne ne devrait-elle pas être "A" et non "A A A"? –