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 :

besoin d'aide pour concaténer


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Points : 13
    Points
    13
    Par défaut besoin d'aide pour concaténer
    Bonjour à tous,

    J'ai un fichier sous cette forme;

    2011-07-22 08:00 toto titi tata
    2011-07-22 08:00 1 2 3
    4 5 6
    2011-07-22 08:01 tic tac
    2011-07-22 08:02
    a b c d
    2011-07-22 08:03 foo bar

    Je voudrais que toutes les lignes qui ne commence pas par une date (YYYY-MM-DD HH:MM) remonte à la fin de la ligne précédente.
    Dans mon exemple ça devrait donner ça ;

    2011-07-22 08:00 toto titi tata
    2011-07-22 08:00 1 2 3 4 5 6
    2011-07-22 08:01 tic tac
    2011-07-22 08:02 a b c d
    2011-07-22 08:03 foo bar

    Je pense que la fonction append (a) de sed pourrais bien faire l'affaire mais j'ai du mal la!

    Merci pour votre aide :o)

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk --re-interval '/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}/{printf "\n" $0 " " } !/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}/{printf $0}' file.txt
    Ca te rajoute simplement une ligne vide en tête, mais bon, ça se vire facilement avec sed par exemple
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    En misant sur le fait qu'aucune ligne autre que les dates ne commencent par plusieurs chiffres suivis d'un tiret

    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
    $ cat plop
    2011-07-22 08:00 toto titi tata
    2011-07-22 08:00 1 2 3
    4 5 6
    2011-07-22 08:01 tic tac
    2011-07-22 08:02
    a b c d
    2011-07-22 08:03 foo bar
    
    $ sed -n '$p;N;/\n[[:digit:]]*-/{P;D};s/\n/ /p' plop
    2011-07-22 08:00 toto titi tata
    2011-07-22 08:00 1 2 3 4 5 6
    2011-07-22 08:01 tic tac
    2011-07-22 08:02 a b c d
    2011-07-22 08:03 foo bar
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,
    En misant sur le fait qu'aucune ligne autre que les dates ne commencent par plusieurs chiffres suivis d'un tiret
    Je serais plus rassurer avec l'heure en plus dans la regexp mais ça je devrait pouvoir le faire.

    Citation Envoyé par zipe31 Voir le message
    $ sed -n '$p;N;/\n[[:digit:]]*-/{P;D};s/\n/ /p' plop
    Yes! On y est presque... je m'explique!
    Mon fichier exemple n'était pas complet. Je voudrais pouvoir gerer aussi et surtout ce cas la ;

    2011-07-22 08:00 1 2 3
    4
    5
    6
    2011-07-22 08:01 tic tac

    Il peut y avoir plusieurs ligne qui ne commencent pas par une date à la suite :o)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Pouic Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk --re-interval '/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}/{printf "\n" $0 " " } !/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}/{printf $0}' file.txt
    Ca te rajoute simplement une ligne vide en tête, mais bon, ça se vire facilement avec sed par exemple
    Ca marche nickel, même dans le cas ou il y a plusieurs ligne à la suite qui ne commence pas par une date! Kool :o) En revanche la commande est flippante! Je trouve le sed plus sexy ^^
    Je vais faire des tests de perf sur mes fichiers log de 800mo pour choisir une fois que j'aurai les 2 syntaxes!

    Merci a vous deux encore une fois!

  6. #6
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par gossebif Voir le message
    Ca marche nickel, même dans le cas ou il y a plusieurs ligne à la suite qui ne commence pas par une date! Kool :o) En revanche la commande est flippante! Je trouve le sed plus sexy ^^
    En même temps, c'est simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /mon_pattern/{ do something }  !/mon_pattern/{do something else}
    :-)
    Après, tu peux alléger : là, je t'ai mis mon_pattern pour matcher exactement le format de date, mais après, tu peux peut-être te contenter de matcher l'année suivie d'un tiret, ça dépend ensuite de tes données :-)
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  7. #7
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Voilà, en tenant compte de la date plus précisément et de plusieurs lignes consécutives sans date...

    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
    20
    $ cat plop                                                                   
    2011-07-22 08:00 toto titi tata
    2011-07-22 08:00 1 2 3
    4 5 6
    7
    8
    2011-07-22 08:01 tic tac
    2011-07-22 08:02
    a b c d
    2011-07-22 08:03 foo bar
    7 8 9
    10
    b n
    
    $ sed -n ':z;$p;N;/\n[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/{P;D};s/\n/ /;bz' plop
    2011-07-22 08:00 toto titi tata
    2011-07-22 08:00 1 2 3 4 5 6 7 8
    2011-07-22 08:01 tic tac
    2011-07-22 08:02 a b c d
    2011-07-22 08:03 foo bar 7 8 9 10 b n
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Points : 13
    Points
    13
    Par défaut
    Les deux méthodes fonctionnent nickel, merci à vous deux!

    Citation Envoyé par zipe31 Voir le message
    $ sed -n ':z;$p;N;/\n[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/{P;D};s/\n/ /;bz' plop
    Je ne voudrais pas abuser de ta gentillesse mais serait il possible de détailler un peu la syntaxe (hormis cette partie \n[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\})

  9. #9
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n ':z;$p;N;/motif/{P;D};s/\n/ /;bz'
    sed -n '
    Affichage sur demande uniquement (conjointement avec le flag "p" ou "P")

    :z
    Étiquette de branchement

    $p
    Si dernière ligne, on l'affiche. (Sans ça, la dernière ligne n'est pas traitée.)

    N
    On ajoute la ligne suivante dans la mémoire principale (buffer/tampon)

    /motif/{
    Pour un motif correspondant, exécuter les actions contenues entre les accolades (groupement de commandes)

    P
    On affiche sur la sortie standard la 1ère partie de la mémoire principale jusqu'au 1er saut de ligne (\n)

    D
    On supprime la 1ère partie de la mémoire principale jusqu'au 1er saut de ligne (\n) et on recommence un nouveau cycle avec la 2nd partie toujours présente dans le buffer.

    }
    Fin du groupement de commandes

    s/\n/ /
    Si le motif ne correspond pas, on substitue le saut de ligne par un espace

    bz'
    On se branche à l'étiquette.
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n ':z;$p;N;/motif/{P;D};s/\n/ /;bz'


    Un grand MERCI!

    Très bonne journée à vous ;o)

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

Discussions similaires

  1. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38
  2. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 19h01
  3. [Kylix] besoin d'aide pour installer kylix3
    Par Sph@x dans le forum EDI
    Réponses: 3
    Dernier message: 11/02/2004, 13h53
  4. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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