Supprimer lignes avec caractère identiques avant modèle

Bonjour,

Voici mon problème.

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.

Exemple:

voici le fichier input

aaa ;2010:05:24
aaa ;2011:02:23
aaa ;2012:01:25
bbb ;2010:02:03
bbb ;2015:04:12
bbb ;2013:03:12
bbb ;2014:06:07
ccc ;2011:05:02
ccc ;2008:09:21

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.

Je m’en remets à vous :pray:

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.

salut,

sort -rV -t ';' -k2 fichier | sort -u -k1,1
1 J'aime

Cette commande marche bien pour mon exemple,
néanmoins sur mon fichier réel cela n’affiche que deux lignes.

En essayant la première partie, soi juste le tri

sort -rV -t ';' -k2 fichier

tout est ok jusque là, les fichiers ont bien été trié par date.

Mais si je fais ensuite

sort -u -k1,1 fichier

Il ne me reste que deux lignes sur les 4000 qui devraient être présente.

En testant un peu j’ai essayer ça
sort -u -t ';' -k1,1 fichier

Cela semble avoir fonctioné :slight_smile:

Merci bien.

Enchainer 2 «sort»; bravo les pros (et merci)

Pourquoi -V ? (j’avoue n’avoir pas tout compris des différents modes de tri expliqués ici.)

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.