Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2939 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1574403
6pique
Posté le 13-06-2007 à 14:29:00  profilanswer
 

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.
 
 

mood
Publicité
Posté le 13-06-2007 à 14:29:00  profilanswer
 

n°1574521
aigles
Posté le 13-06-2007 à 17:10:29  profilanswer
 

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.

n°1575174
phdenis
Posté le 14-06-2007 à 20:39:31  profilanswer
 

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
n°1576601
6pique
Posté le 19-06-2007 à 08:21:35  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
détecter des ligne sur un eimage texte[Résolu]Programme supprimant les commentaires d'un fichier C
Besoin aide en PHP,lister un fichierGénération de fichier xml à partir de php mysql. [Résolu]
Récupérer le S/N + le prix dans un fichier CSVRequete sql lister doublons
"Open With...." et fichier multiplesProb : Affichaque que d'une seule ligne ...
clonage d'un objet recupere a partir d'un fichier XMLFaire remonter une ligne sans scroller
Plus de sujets relatifs à : Supprimer des doublons d'un fichier en conservant la dernière ligne


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR