Éliminer les doublons dans un fichier

Résolu
poiuytreza01234567890 Messages postés 57 Statut Membre -  
 Utilisateur anonyme -
Bonjour,

J'ai un fichier sous cette forme:
A B
C D
C C
B A
D A
Je veux que j'élimine le cas où $1=$2 (exemple: C C) et si je suis dans le cas (A B)/(B A) je veux qu'il élime une et me laisse l'autre. pour avoir un fichier de sortie comme ça:
A B
C D
D A
Comment en fait ça sous bash?

Merci

3 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    $ cat fichier
    A B
    C D
    C C
    B A
    D A 
    $ awk '{split($0, a); asort(a); s=a[1] a[2]; if(!t[s]++ && (a[1] != a[2]))print $0}' fichier
    A B
    C D
    D A 
    $
    2
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    En bash c'est un peu compliqué car tu dois mémoriser toutes les lignes que tu as croisé. Si il n' y a pas de contraintes sur l'ordre dans lequel sorte les lignes c'est déjà plus facile, tu peux boucler sur chaque ligne de sorte à ce que la première lettre précède toujours la seconde dans l'ordre alphabétique), mais je n'ai pas l'impression qu'il y ait d'opérateur -lt ou < pour le texte en bash. Du coup awk est peut être plus adapté pour cette partie.

    Ensuite tu rajoutes un | sort | uniq derrière et l'affaire est dans le sac.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut mamie,

      mais je n'ai pas l'impression qu'il y ait d'opérateur -lt ou < pour le texte en bash.
      Si, depuis bash 4 c'est possibeul ;-))

      Extrait du man bash :
      Lorsqu'ils  sont  utilisés  avec  [[,  les opérateurs < et > ordonnent d'un point de vue lexicographique en utilisant les paramètres linguistiques régionaux courants.
      0
    2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
       
      Ah parfait :-) Ce matin j'avais essayé avec des crochets simples et ça ne marchait pas, c'était donc juste ça :-)
      0
    3. Utilisateur anonyme
       
      en effet, avec test et [, il faut protéger les chevrons
      test A \< B && echo OK || echo KO
      sinon le shell les interprète comme une redirection.
      0
  3. poiuytreza01234567890 Messages postés 57 Statut Membre
     
    Merci
    0