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 :

Trouver la ligne du dernier motif d'un grep


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut Trouver la ligne du dernier motif d'un grep
    Bonjour,

    Un programme me sort dans un fichier texte une suite de tableaux (5 colonnes de chiffres)
    chaque tableau est introduit par la même chaîne de caractères.
    Je voudrais extraire le dernier tableau.
    Pour l'instant la seule solution technique que j'aie trouvé c'est :
    Déterminer le nombre de lignes dans le fichier
    Comme il y a toujours le même nombre de ligne dans le tableau supprimer le nombre de ligne du tableau pour retrouver la première ligne de tableau.
    copier à partir de là.
    D'où ma question :
    Est-il possible de faire un grep ou une commande du même genre et de là déterminer le numéro de la ligne où apparaît pour la dernière fois le motif ?

    Merci

  2. #2
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par Erlen Voir le message
    Je voudrais extraire le dernier tableau.
    Le plus simple, c'est d'utiliser awk

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    Oui sans doute mais il faudrait être plus précis parce que je suis pas un grand connaisseur, et awk c'est vaste très vaste (peut être trop ?)

  4. #4
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par Erlen Voir le message
    Oui sans doute mais il faudrait être plus précis parce que je suis pas un grand connaisseur, et awk c'est vaste très vaste (peut être trop ?)
    Et tu veux que je ponde le code pour toi ?

  5. #5
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $ cat toto
    1 2 3 4 5
    z b c f d
    z b c f d
    z b c f d
    z b c f d
    z b c f d
    z b c f d
    z b c f d
    z b c f d
    $ grep z toto | cat -n | awk '{print $1}' | tail -1
    8
    $
    ca c'est la façon moche de faire mais comprehensible par tout le monde
    ici on cherche la derniere ligne contenant "z"
    la meme chose bien plus simplement notez que sed compte les lignes depuis 1 et pas depuis 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ sed -n '/z/=' toto | tail -1
    9
    $

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    Pourquoi pas c'est toujours gentil et ça me ferait forcement gagner du temps !
    J'ai oublié de stipuler que j'utilise bash donc je sais pas coder directement en awk.
    En fait je connais pas awk j'ai utilisé quelque fois des commandes awk dans des scripts bash mais pas grand chose de plus.
    Donc quand tu dis il faut utiliser awk tu comprends que ça me fait pas avancer.
    Sans forcement avoir le code, quelle fonction de awk tu utiliserais si j'arrive pas à l'utiliser alors je demanderais plus d'aide.
    Merci

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    frp31 deux questions :
    Dans les deux cas pourquoi le tail -1 ?
    dans le cas du awk pourquoi le cat ?

  8. #8
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    En awk ( pseudo-code ) - Recherche générique

    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
    21
    22
    23
    24
    25
     
    DEBUT{
     
    }
    {
      SI ( LIGNE ~ /SEPARATEUR D'EREGISTREMENT/ ) {
        ON EST SUR UN NOUVEL ENREGISTREMENT 
        SI (MATCH)  ON COPIE LE CONTENU DU TABTMP DANS LASTMATCH
        RESET_VARIABLE    
      }
      SINON 
      {
        ON COPIE LA LIGNE DANS NOTRE TABTMP 
         SI ( LIGNE = CORRESPOND A LA RECHERCHE ) 
         {
                ON A UN MATCH
         }
     
      }
     
    }
    END 
    {
     AFFICHE LAST_MATCH
    }

  9. #9
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Citation Envoyé par Erlen Voir le message
    frp31 deux questions :
    Dans les deux cas pourquoi le tail -1 ?
    dans le cas du awk pourquoi le cat ?

    man tail et accessoirement testes le sans pour comprendre
    man cat et accessoirement testes le sans pour comprendre


  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 90
    Points : 111
    Points
    111
    Par défaut meme pas besoin de awk
    les données :
    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
    $ cat test.dat
    a:1 2 3 4 5
    b:2 3 4 5 6
    c:3 4 5 6 7
    a:4 5 6 7 8
    b:5 6 7 8 9
    c:6 7 8 9 10
    a:7 8 9 10 11
    b:8 9 10 11 12
    c:9 10 11 12 13
    a:10 11 12 13 14
    b:11 12 13 14 15
    c:12 13 14 15 16
    a:13 14 15 16 17
    b:14 15 16 17 18
    c:15 16 17 18 19
    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep a test.dat | tail -1
    a:13 14 15 16 17

  11. #11
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Citation Envoyé par rafuoner Voir le message
    les données :
    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
    $ cat test.dat
    a:1 2 3 4 5
    b:2 3 4 5 6
    c:3 4 5 6 7
    a:4 5 6 7 8
    b:5 6 7 8 9
    c:6 7 8 9 10
    a:7 8 9 10 11
    b:8 9 10 11 12
    c:9 10 11 12 13
    a:10 11 12 13 14
    b:11 12 13 14 15
    c:12 13 14 15 16
    a:13 14 15 16 17
    b:14 15 16 17 18
    c:15 16 17 18 19
    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep a test.dat | tail -1
    a:13 14 15 16 17
    mais tu choppes pas le n° de la ligne !

    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 c
    a:1 2 3 4 5
    b:2 3 4 5 6
    c:3 4 5 6 7
    a:4 5 6 7 8
    b:5 6 7 8 9
    c:6 7 8 9 10
    a:7 8 9 10 11
    b:8 9 10 11 12
    c:9 10 11 12 13
    a:10 11 12 13 14
    b:11 12 13 14 15
    c:12 13 14 15 16
    a:13 14 15 16 17
    b:14 15 16 17 18
    c:15 16 17 18 19
    $ grep -n a c | tail -1
    13:a:13 14 15 16 17
    $ # la oui
    $

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

Discussions similaires

  1. [Excel] Le + rapide pour trouver 1 ligne
    Par WagaSeb dans le forum Excel
    Réponses: 4
    Dernier message: 20/03/2007, 16h12
  2. [Débutant] Trouver la ligne exceptionnante
    Par Le Furet dans le forum Langage
    Réponses: 4
    Dernier message: 02/12/2006, 18h22
  3. Réponses: 6
    Dernier message: 08/07/2006, 12h07
  4. Réponses: 7
    Dernier message: 19/08/2005, 09h13
  5. Réponses: 3
    Dernier message: 21/01/2004, 08h47

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