2017-06-06 4 views
0

Cela devrait être comme exécuter une commande uniq, mais par colonnes. Par exemple:Meilleure façon de supprimer les colonnes dupliquées dans Linux

A B C B
A C B C
A A A A

deuxième et quatrième colonnes sont identiques. Quel est le meilleur moyen d'obtenir le résultat suivant?

A B C
A C B
A A A

Cependant, dans un premier temps on ne sait pas quelles colonnes sont identiques, tout comme avec la commande uniq pour les lignes.

+1

Si les colonnes doivent être uniformes, la dernière colonne ne devrait-elle pas être "A" et non "A A A"? –

Répondre

0

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.