IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

grep et une expression régulière


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 18
    Par défaut grep et une expression régulière
    Bonsoir tout le monde !

    Je ne suis pas un développeur de talent (en fait je ne suis pas développeur du tout, mais je développe un peu quand même, alors ça crée des problèmes ). Voilà ce que j'essaye de faire : j'ai un très gros fichier que je veux subdiviser en petits fichiers. Une ligne de ce fichier = une donnée. Il est formaté de la manière suivante :
    (Date,Heure,donnée1,donnée2,donnée3)
    jj/mm/aaaa,hh:mm:ss.ssssss,xxxxx.xx,xxxxx.xx,xxxxx.xx
    ex : 28/05/2012,12:33:02.000,817375.767,9471391.780,33.000
    Je voudrais donc créer un fichier par nuit. Donc pas de minuit à 23:59, mais de 12:00 à 11:59 le lendemain. Je vous donne mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/bin/ksh
     
    SOIR=27/05/2012 # Initialisation : première date que je vais considérer
     
    # je veux une arborescence du type : année/mois
    mkdir -p $DIR_DATA/$(echo $SOIR|awk -F'/' '{print $3}')/$(echo $SOIR|awk -F'/' '{print $2}')
    fichier_out=$DIR_DATA/$(echo $SOIR|awk -F'/' '{print $3}')/$(echo $SOIR|awk -F'/' '{print $2}')/"$(echo $SOIR|sed -e "s./._.g").txt"
     
    # Je boucle sur les dates UNIQUES differentes dans le gros fichier à diviser, et j'enlève la première de ces dates puisqu'on s'en est déjà occupé juste avant.
    for data_file in $(tail -n +4 $DIR_DATA/Week22_33_Congo_GNSS-2.txt | cut -d, -f1 | uniq | grep -v "27/05/2012")
    do
       MATIN=$data_file # Donnée du jour suivant (dont je ne veux récupérer que la première partie à l'aide du grep)
       grep -E "^($SOIR,[12-23])|($MATIN,(0[0-9])|[10-11]):" $DIR_DATA/test.txt > $fichier_out
       SOIR=$MATIN # Donnée du jour "précédent" (au passage suivant de la boucle)
       # Je crée un nouveau dossier si je change de mois
       mkdir -p $DIR_DATA/$(echo $SOIR|awk -F'/' '{print $3}')/$(echo $SOIR|awk -F'/' '{print $2}')
       # Je crée mon nouveau fichier
       fichier_out=$DIR_DATA/$(echo $SOIR|awk -F'/' '{print $3}')/$(echo $SOIR|awk -F'/' '{print $2}')/"$(echo $SOIR|sed -e "s./._.g").txt"
    done
    Mais ça ne marche pas. Je soupçonne la regex d'être fausse, mais comme je n'arrive pas à la corriger si c'est bien le cas.

    Toute aide est la bienvenue, et sera de facto appréciée

    Merci !

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    [x-y] définit un intervalle entre deux caractères, et non entre deux valeurs.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    [x-y] définit un intervalle entre deux caractères, et non entre deux valeurs.
    Donc, il faut remplacer [12-23] par (12|13|14|15|16|17|18|19|20|21|22|23) ou (1[2-9]|2[0-3]) et (0[0-9])|[10-11]) par (0[0-9])|1[01]) (la seconde était presque bonne!)

    [EDIT]: Oops! je n'avais pas vu la réponse de Don_Q (grillé!)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 18
    Par défaut
    @Sve@r : Effectivement, l'ordre n'est pas le bon dans la commande cut que tu as proposé, j'en ai donc utilisé deux, ça marche très bien.

    @N_BaH et jack-ft : merci pour votre aide !

    Tout marche très bien, je marque la discussion comme résolue. Bonne journée !

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Don_Q Voir le message
    Toute aide est la bienvenue, et sera de facto appréciée
    Salut

    N_Bah est très calé avec les regex donc je lui laisse le soin de te la corriger. Moi de mon coté j'ai remarqué que tu aimes bien awk.
    Le pb c'est que awk est super gourmand en ressources (normal vu ce qu'il peut faire). Donc l'appeler et le rappeler sans cesse juste pour découper un champ...
    mkdir -p $DIR_DATA/$(echo $SOIR|cut -f3,2 -d/)(j'ai tapé de mémoire sans tester donc je ne suis pas certain que le cut te donnera les champs dans le bon ordre mais au pire tu peux aussi en mettre 2, de toute façon 2 cut à suivre seront moins gourmands que 2 awk).

    Sinon essaye de mettre tes noms de variable en minuscule plutôt qu'en majuscules qui sont réservées aux variables système et que tu peux donc écraser. Tu peux y mettre des majuscules illustratives (comme par exemple "dateDeValeur") mais pas le "tout majuscule"...

    Et si tu pouvais encadrer ton code de balises "CODE" et non "QUOTE" on pourrait le reprendre et le corriger pour le remettre en réponse...

    PS: tu as "SOIR" qui vaut 27/05/2012 et plus tard tu greppes sur 27/05/2012 => peut-être grepper sur "$SOIR"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 18
    Par défaut
    Il est déjà tard dans la nuit là ... alors bonne nuit tout le monde !

    @Sve@r : dès que je suis en face de mon code, j'essaye de remplacer mes awk par des cut. C'était évident, mais il fallait me le dire. Et je grepperai sur Soir dans la boucle.

    @N_BaH : je crois avoir compris, mais je ne suis pas sûr. Je dis ce que j'ai compris, sachant que je ne pourrai le tester que demain. Je veux récupérer une heure pour savoir si je suis après 12h le jour1 et avant 12h le jour deux. La date est sur deux caractères, donc il me faut quelques chose qui ressemble plus à 1[2-9]|2[0-3] à la place de [12-23], et donc 0[0-9] | 1[0-1] à la place de 0[0-9])|[10-11], c'est ça ?

    Je le répète, je ne suis pas développeur (cad, je code avec les pieds, et j'ai les pieds palmés :p ). Or, ici mon problème était de faire rapidement ce découpage (fichier d'entrée : 7 millions de lignes). Donc, merci beaucoup à vous deux : à N_BaH qui m'aide à débugger mon code, et à Sve@r qui m'aide à le rendre plus performant !

    Bonne nuit (encore !)

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Citation Envoyé par Don_Q
    c'est ça ?
    c'est ça !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EXP] Evaluation dans une expression régulière
    Par SergentHeinz dans le forum Langage
    Réponses: 7
    Dernier message: 10/11/2005, 18h17
  2. Une expression réguliére
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/09/2005, 20h14
  3. Réponses: 6
    Dernier message: 17/08/2005, 12h38
  4. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 10h54
  5. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo