Je possède un fichier texte comprenant de nombreuses lignes identiques mais ne finissant pas de la même façon. La fin de chaque ligne finie par un point virgule suivit d’une date.
J’aimerais supprimer les lignes identiques en ne gardant uniquement celles qui contiennent la date la plus récente.
voici à quoi j’aimerais que le fichier output ressemble:
aaa ;2012:01:25
bbb ;2015:04:12
ccc ;2011:05:02
J’ai bien sur penser à utiliser sed, mais je bloque pour comparer les caractères uniquement avant le point virgule et pas toute la ligne puis pour lui faire garder celle avec la date la plus récente.
for i in aaa bbb ccc; do egrep ^« ${i} » fichier_a_filtrer.txt | sort | tail -1 >> fichier_resultat.txt; done
En bash, les pipes sont souvent une meilleure solution
1- Sélectionner les lignes à filtrer (boucle for, filtre egrep)
2- Trier tout simplement avec sort
C’est facile car la format de la date est adapté: année, mois, jour.
3- Extraire le premier élément avec tail -1
le souci avec le code que tu propose c’est qu’on obligé de nommer les lignes duppliqués.
Hors le fichier en question contient 14K lignes dont environ 4000 sont différentes les unes des autres.
Autre précision que je découvre: l’option -u de sort n’agit que sur le champs de tri (si j’ai bien compris, sans évoquer l’histoire de l’option -c ou -C ou --check), alors que la commande uniq agirait sur toute la ligne, ce qui permet d’éviter le tail de ma commande à rallonge.