Supprimer des doublons d'un fichier en conservant la dernière ligne

Supprimer des doublons d'un fichier en conservant la dernière ligne - Shell/Batch - Programmation

Marsh Posté le 13-06-2007 à 14:29:00    

Bonjour,
 
Sous Unix, j'ai un fichier nommé toto sous ce format :
AABB;CCDD;TITI
BBAA;DDCC;LULU
AABB;CCDD;TOTO
 
De ce fichier, je veux supprimer les doublons sur les 10 premiers caractères.
J'ai donc passer la commande suivante :
 
sort -u +0.0 -0.10 toto > titi
 
En résultat, j'obtiens bien deux lignes
AABB;CCDD;TITI
BBAA;DDCC;LULU
 
mais je ne veux pas de la ligne TITI mais de la ligne TOTO.
Quand j'inverse les deux lignes dans le fichier et que je repasse la commande, j'obtiens toujours le même résultat.
Je pense donc que le sort prend la plus petite donnée en tri alphabétique.
Est-ce-que je me trompe ?
Y-a-t-il une solution pour obtenir le résultat suivant :
AABB;CCDD;TOTO
BBAA;DDCC;LULU
 
Merci de votre aide.
 
 

Reply

Marsh Posté le 13-06-2007 à 14:29:00   

Reply

Marsh Posté le 13-06-2007 à 17:10:29    

Pour l'option -u, sort prend effectivement la première ligne (tri alphabétique de la ligne complète).
Un petit extrait de la doc (GNU) sort :

Citation :

  A pair of lines is compared as follows: `sort' compares each pair of
fields, in the order specified on the command line, according to the
associated ordering options, until a difference is found or no fields
are left.  If no key fields are specified, `sort' uses a default key of
the entire line.  Finally, as a last resort when all keys compare
equal, `sort' compares entire lines as if no ordering options other
than `--reverse' (`-r') were specified.  The `--stable' (`-s') option
disables this "last-resort comparison" so that lines in which all
fields compare equal are left in their original relative order.  The
`--unique' (`-u') option also disables the last-resort comparison.


Tu ne peux pas faire un tri sans option -u et traiter le résultat par la commande uniq car cette traite la ligne complète.  
Il va donc te falloir ecrire ta propre commande uniq
Voici un example (my_usort.sh) de ce qui peut être fait:

sort -k1,1.10 sort.txt | \
awk '
   {
      key=substr($0,1,10);
      if (key != prv_key && prv_rec)
         print prv_rec;
      prv_key = key;
      prv_rec = $0;
   }
   END {
     if (prv_rec) print prv_rec;
   } '

Utilisation:

$ cat sort.txt
AABB;CCDD;TITI
BBAA;DDCC;LULU
AABB;CCDD;TOTO
$ my_usort.sh
AABB;CCDD;TOTO
BBAA;DDCC;LULU
$


 
 
Jean-Pierre.

Reply

Marsh Posté le 14-06-2007 à 20:39:31    

Salut,
 
Tu peux aussi faire un sed sur la ligne contenant le terme TITI. Par exemple, un sed '/TITI/d/' toto > titi à la suite de ta commande sort -u ...  
 
Phil.
 
Ps: A verifier pour la syntaxe du sed, j'ai pas de console unix sous la main.


Message édité par phdenis le 14-06-2007 à 20:40:31
Reply

Marsh Posté le 19-06-2007 à 08:21:35    

Merci Phil,
 
Le problème c'est que, dans mon fichier, le contenu de ce champ est variable et je ne sais donc pas ce que doit contenir le max de la colonne.
 
Le petit script de Jean-Pierre fonctionne à merveille pour suppléer l'option manquante du sort.
 
Merci beaucoup.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed