Supprimer toutes les lignes avant la ligne qui contient une Variable.

Résolu/Fermé
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024 - 17 sept. 2021 à 15:42
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024 - 20 sept. 2021 à 17:29
Bonjour,

J'ai un gros fichier qui ne fait que grossir. Chaque ligne contient sur son 3eme champ la date au format: AAA-MM-JJTHH-MM.

J'aimerais ne garder que les 35 derniers jours et donc supprimer toutes les lignes antérieurs à
DATE35.

DATE35=`date --date "35 days ago" -u +"%Y-%m-%dT%H:%M"`

J'imagine faire une recherche dans le fichier de la variable DATE35, dès qu'il la trouve, il supprime toutes les lignes précédentes.

Une idée sans faire une boucle sur chaque ligne?

Merci.
A voir également:

5 réponses

dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
18 sept. 2021 à 09:44
hello
n=0 donc on n'imprime rien tant qu'il n'y a pas DATE35
quand on trouve DATE35, n=1 et on imprime
awk -F ',' -v var="$DATE35"  -v n=0 '$3 ~ var {n=1}; n {print $0}' FIC 
1
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
20 sept. 2021 à 16:53
imprimer veut dire on garde les lignes, par ex. en les redirigeant dans un nouveau fi chier
1
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
Modifié le 20 sept. 2021 à 16:48
J'ai déjà trouvé ça pour supprimer les lignes dont le 3ème champs est contient la DATE35

awk -F','  -v var="$DATE35" '$3 !~ var' FIC


Si le traitement est exécuté tous les jours , ça fera le boulot mais j'aurais préféré qu'il supprime aussi les lignes précédentes.
0
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
20 sept. 2021 à 14:22
Bonjour,

Désolé, je n'ai pas compris la ligne.
Pourquoi on imprime? le but est de supprimer les lignes dont la date est antérieure à DATE35 sur le 3eme champ.

Merci.
0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
Modifié le 20 sept. 2021 à 16:55
Bonjour,

La solution que dubcek te propose suppose que les lignes sont triées par date croissante (selon le 3e champ) et part du principe que tu appliques la commande
awk
à ce flux, qui fera office de filtre : les lignes conservées traverse
awk
et sont donc écrites, les autres sont ignorées et donc filtrées.

Dans sa solution, dubcek te propose de maintenir une variable
n
qui vaut
0
tant qu'on n'a pas rencontré DATE35, et qui est égale à
1
quand on l'a rencontrée au moins une (cf
$3 ~ var {n=1};
). Si
n
vaut
0
, alors on est en train de traiter une ligne dont la date est inférieure à
DATE35
et donc on ne fait rien. Si
n
vaut
1
, on la réécrit, ce qui revient à traverser le filtre.

Pour compléter la discussion, note que que cette discussion s'intéresse à un problème un peu plus général : extraire les lignes d'un log comprises dans un intervalle de temps. Tu peux donc facilement adapter les solutions proposées dans cette discussion à ton cas de figure.

Bonne chance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
20 sept. 2021 à 17:29
Merci, c'est beaucoup plus clair.

Bonne journée à tous.
0