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 :

Extraire deux lignes précédentes?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Doctorant
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Par défaut Extraire deux lignes précédentes?
    Bonjour,

    Voici un fichier "res.txt" qui contient :

    Pos X [at 155.631] -64.5426
    Pos Y [at 155.631] 866.022
    ** HO **
    je veux extraire les deux lignes précédentes du "** HO **" c'est à dire:


    #Time Pos X Pos Y
    155.631 -64.5426 866.022


    dans un autre fichier "HO.txt"


    voici mon essai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep "** HO **"&&"Pos X|Pos Y"  res.txt | awk 'BEGIN{print "#Pos X","#Pos Y","#Time"}{A=$5 ; B=$4;getline ; print A,$5,B}' > HO.txt

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je me base sur un fichier res.txt supposé comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Pos X [at 155.631] -64.5426
    Pos Y [at 155.631] 866.022
    ** HO **
    Pos X [at 158.002] -30.66
    Pos Y [at 158.002] 15.493
    ** HO **
    Pos X [at 192.53] 6.802
    Pos Y [at 192.53] 480.6735
    ** HO **
    le oneliner awk suivant fait le job :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[ \\[\\]\t]+' 'BEGIN {printf("%-20s%-20s%s\n", "# Time", "Pos X", "Pos Y")} /^Pos [XY]/ {t=$4; tab[$2] = $5; next} /^\*\* HO/ {printf("%-20s%-20s%s\n", t, tab["X"], tab["Y"])}' res.txt
    qu'on peut "déplier" de la façon suivante pour un peu plus de lisibilité :
    Code awk : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BEGIN {
       printf ("%-20s%-20s%s\n", "# Time", "Pos X", "Pos Y")  # 1ère ligne de l'affichage
    }
     
    /^Pos [XY]/ {      # pour chaque ligne qui commence par "Pos X" ou "Pos Y"
       t=$4            # t = Time
       tab[$2] = $5    # tab["X" ou "Y"] = valeurX ou valeurY
       next            # fin du traitement pour cette ligne,  on passe à la ligne suivante
    }
     
    /^\*\* HO/ {  # si on rencontre une ligne qui commence par "** HO", c'est qu'il est temps d'afficher
       printf("%-20s%-20s%s\n", t, tab["X"], tab["Y"])
    }
    l'option -F'[ \\[\\]\t]+' permet de spécifier les séparateurs de champs, en l'occurrence "un ou plusieurs espace, tabulation (\t), ou crochet ([ ou ] qu'on est obligé d'échapper 2 fois \\[\\])"

    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Time              Pos X               Pos Y
    155.631             -64.5426            866.022
    158.002             -30.66              15.493
    192.53              6.802               480.6735

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,

    Alors là, c'est vraiment pour le fun :
    En reprenant le fichier de bufferbob.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ( echo -e "#Time Pos_X Pos_Y" ; grep -B 2 HO fichier.txt | grep -v HO | paste -d ' ' - - | tr '\[\]' ' ' | column -t | colrm 1 12 | colrm 18 39) | column -t | tr '_' ' '
    #Time     Pos X       Pos Y
    155.631  -64.5426  866.022
    158.002  -30.66      15.493
    192.53    6.802       480.6735

  4. #4
    Expert confirmé

    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
    Par défaut
    Salut,

    Tout comme disedorgue, pour le fun également

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sed '/^** HO/d;N;s/[^[:digit:]. -]//g;s/ *[^ ]* //3' fich 
       155.631 -64.5426 866.022
       158.002 -30.66 15.493
       192.53 6.802 480.6735

  5. #5
    Membre actif
    Homme Profil pro
    Doctorant
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Par défaut
    Merci à tous
    Qu'est ce que vous me conseiller comme livre (ou bien un site pour débutant) pour apprendre bien les bases du Shell?

    Cordialement,

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    As-tu déjà consulté les tutoriels présents ici ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre actif
    Homme Profil pro
    Doctorant
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Alors là, c'est vraiment pour le fun :
    En reprenant le fichier de bufferbob.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ( echo -e "#Time Pos_X Pos_Y" ; grep -B 2 HO fichier.txt | grep -v HO | paste -d ' ' - - | tr '\[\]' ' ' | column -t | colrm 1 12 | colrm 18 39) | column -t | tr '_' ' '
    #Time     Pos X       Pos Y
    155.631  -64.5426  866.022
    158.002  -30.66      15.493
    192.53    6.802       480.6735
    Pourrais-tu m 'éclaircir chaque champ?

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Comme je disais, c'est vraiment pour le fun, donc pour la compréhension de certaines commandes, c'est intéressant, mais je ne le conseillerais pas pour un script.

    Alors, coté fonctionnement, cela se passe en 2 étapes:
    le sous script suivant (qu'il faut voir comme une seule commande unique):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $( echo -e "#Time Pos_X Pos_Y" ; grep -B 2 HO fichier.txt | grep -v HO | paste -d ' ' - - | tr '\[\]' ' ' | column -t | colrm 1 12 | colrm 18 39)
    Et dont, au résultat de celui-ci, on effectue les filtres suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    | column -t | tr '_' ' '
    La commande column -t prend la première ligne en entrée et considère celle-ci comme la ligne de titre de chaque colonne (option -t).
    La commande tr '_' ' ' remplace le caractère "_" par le caractère " " (espace): ici le carctère "_" n'est que dans la ligne de titre pour Pos_X ou Pos_Y car sinon la commande column aurait considéré "Pos X" comme 2 colonne au lieu d'une (idem pour "Pos Y")

    Maintenant, décrivons le sousscript:
    on écrit le en premier lieu le titre de chaque colonne (la commande echo "....")
    ensuite, nous effectuons les différents filtres sur le fichier:
    grep -B 2 HO fichier.txt : on recherche HO et les 2 lignes précédente (option -B 2).
    A ce résultats:
    grep -v HO : on affiche toutes les lignes qui n'ont pas HO (option -v pour la négation de la recherche).
    paste -d ' ' - - : on met sur une seule ligne 2 lignes contiguës, ce qui permet d'avoir sur la même ligne la ligne Pos X et la ligne Pos Y.
    tr '\[\]' ' ' : permet de remplacer "]" ou "[" par un espace.
    column -t : permet juste d'aligner les champs.
    colrm 1 12 : supprime du caractère 1 au caractère 12
    colrm 18 39 : supprime du caractère 18 au caractère 39

    Et voila...

  9. #9
    Membre actif
    Homme Profil pro
    Doctorant
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Par défaut
    Merci pour cette explication.



    j'ai ce fichier:
    UserPosition X [at 155.631] -64.5426
    UserPosition Y [at 155.631] 866.022
    ** HO ** for user 0

    UserPosition X [at 168.069] -94.9881
    UserPosition Y [at 168.069] 866.025
    ** HO ** for user 0
    J'ai essayé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ( echo "#Time Pos_X Pos_Y" ; grep -B 2 HO input.txt | grep -v HO | tr '\[\]' ' ' | colrm 1 20 )  > output.txt
    le résultat est:
    #Time Pos_X Pos_Y
    155.631 -64.5426
    155.631 866.022

    168.069 -94.9881
    168.069 866.025
    et moi je veux:
    #Time Pos_X Pos_Y
    155.631 -64.5426 866.022
    168.069 -94.9881 866.025
    J'ai essayé avec les codes précédents mais sans succès

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/08/2014, 21h36
  2. [Débutant] comment extraire deux lignes aleatoires d'une matrice?
    Par linda05 dans le forum MATLAB
    Réponses: 5
    Dernier message: 15/05/2014, 19h23
  3. Extraire des lignes precises d'un fichier
    Par keke33 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 03/06/2004, 10h52
  4. Scripts : Extraire une ligne
    Par nemohck dans le forum Linux
    Réponses: 7
    Dernier message: 03/11/2003, 20h40
  5. Deux lignes sur un TButton
    Par bml dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/07/2003, 11h17

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