Awk dédoublonner un print

Résolu
Deep -  
 deeper -
Bonjour à tous,

J'ai un fichier (TOTO) du type :
OFFRE;CIBLE;TYPE;NOM

12345;111;1;DUPOND
12345;111;1;DURAND
12345;888;1;MARTIN
12345;888;2;MAURICE
23456;444;1;ANDRE

Et je souhaiterais à la fois ne conserver que les 3 premiers champs et dédupliquer ce fichier en même temps

12345;111;1
12345;888;1
12345;888;2
23456;444;1

Mon script est alors :
awk 'print $1, $2, $3, $4' TOTO > TITI
sort -u TITI > TUTU

Seulement le fichier contient environ 1 million de lignes, et l'écriture du fichier TITI est très longue. Alors que si je pouvais à la fois ne conserver que les 3 premiers champs et le dédupliquer, ce serait parfait.

Merci pour votre aide.
Deep

3 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    tu veux purger TOTO des doublons ? donc
    awk 'BEGIN{FS=OFS=";"} !t[$1, $2, $3]++ {print $1, $2, $3 }' TOTO | tee TITI > TUTU
    
    2
    1. deeper
       
      C'est ça que je voulais.
      C'est rapide et simple.

      Merci beaucoup à tous ! Génial !
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    awk 'BEGIN{FS=OFS=";"} {print $1, $2, $3 > "TITI" ; print $1, $2, $3 > "TUTU" }' TOTO
    ou
    awk 'BEGIN{FS=OFS=";"} {print $1, $2, $3 }' TOTO | tee TITI > TUTU
    1
    1. Deep
       
      Bonjour,

      Merci beaucoup.
      Malheureusement, le délai d'exécution est encore long étant donné que l'on écrit 2 fichiers.
      L'idéal serait de conserver dans un array les valeurs unqiues $1 $2 $3 et ne les écrire qu'à la fin.
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      et 2 tâches en parallèle
      awk 'BEGIN{FS=OFS=";"} {print $1, $2, $3 }' TOTO > TITI  & awk 'BEGIN{FS=OFS=";"} {print $1, $2, $3 }' TOTO > TUTU &
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Et un "cp" à la fin ?

      awk 'BEGIN{FS=OFS=";"} {print $1, $2, $3 }' TOTO > TITI && cp TITI TUTU
      0
  3. deeper
     
    Je m'exprime mal, désolé.
    Je disais 2 fichiers car on va :
    1) créer un fichier contenant les 3 premières colonnes du fichier d'entrée
    2) utiliser le fichier créé avec les 3 colonnes pour le dédoublonner
    Je me demandais alors si on ne pouvait pas utiliser un array pour stocker les valeurs de $1 $2 $3, comparer chaque ligne du fichier d'entrée au contenu de ce tableau, et si $1 $2 $3 n'existent pas alors on les stocke dans la variable.
    Enfin, on vide la variable dans un fichier
    Du coup, on n'aurait l'écriture que d'un fichier.
    0