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 POSIX Discussion :

[awk] Afficher certaines lignes d'un fichier


Sujet :

Shell et commandes POSIX

  1. #1
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [awk] Afficher certaines lignes d'un fichier
    Bonjour,

    je souhaitais faire un programme simple pour parser un fichier en ligne de commande sous Windows. Je suis tombé sur gawk qui semble avoir les mêmes fonctions que awk.
    J'ai commencé par un test avant de compliquer, lire ligne par ligne un fichier texte et n'afficher que les lignes contenant "test" :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    code : BEGIN {} 
     
     
    END {
    for (i=0 ; i<NF ; i++) {
       toto = match($i, "test") 
       if (toto) 
          printf("%s",$i)
       } 
     
    }
    je lis le fichier ligne par ligne, je vérifie si on trouve le mot clé test et si oui j'affiche la ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Texte :1abc1231dfdffdfd dfdfdfdf dezaedqsc test dssq]dsqdq
    2zxs test dsqsdsfq dfqf q fdqs] 
    3qfsdf
    4qfdqxc
    5test cxxc]
    6abc123 6sdsq
    7cxwxcxw
    8testuoi]
    9fdfdqfdqf
    10dsffdfd  test dsd]sdss
    11qfqffq qdsq qssq qf qsf qsf qf qsdrzadsqtestfgg]f
    En lançant le programme, il ne m'affiche que la dernière ligne ? J'ai surement mal compris une chose mais je ne vois pas quoi.
    Est-ce que vous pourriez m'apporter vos lumières.

    Merci d'avance pour votre aide.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/test/' tonFichier
    tu pourrais très bien utiliser grep pour une requête aussi simple.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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
    ou même sed aussi ...

    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
    # cd /tmp/
    # cat > toto
    1abc1231dfdffdfd dfdfdfdf dezaedqsc test dssq]dsqdq
    2zxs test dsqsdsfq dfqf q fdqs] 
    3qfsdf
    4qfdqxc
    5test cxxc]
    6abc123 6sdsq
    7cxwxcxw
    8testuoi]
    9fdfdqfdqf
    10dsffdfd  test dsd]sdss
    11qfqffq qdsq qssq qf qsf qsf qf qsdrzadsqtestfgg]f
    ^D
    # sed '/test/ !d' toto  
    1abc1231dfdffdfd dfdfdfdf dezaedqsc test dssq]dsqdq
    2zxs test dsqsdsfq dfqf q fdqs] 
    5test cxxc]
    8testuoi]
    10dsffdfd  test dsd]sdss
    11qfqffq qdsq qssq qf qsf qsf qf qsdrzadsqtestfgg]f
    # rm toto
    # cd -
    /root
    #

  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
    Petites précision sur gawk

    Ton code se découpe en 3 bloc

    BEGIN : ce que tu fait avant de lire le fichier

    CORPS : ( qui n'est pas préfixé ), le traitement que tu effectues ligne par ligne. Tu n'as généralement qu'un seul bloc mais tu pourrais en avoir plusieurs.

    END : ce que tu fait une fois que le fichier a été lu


    Petit exemple simpliste. Ici, il y a deux blocs d'opérations par ligne mais ce n'est que pour l'exemple

    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
     
    BEGIN{
     print "Debut du fichier"
     i=0;
    }
     
    {
     print "Traitement de la ligne " i
    }
     
    {
     print " second traitement de la ligne "
     i++
    }
     
    END{
      print "Nombre de lignes :  " i
      print "Fin"
     
    }

  5. #5
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci à tous pour votre aide, j'aurais une dernière question.
    J'ai essayé d'extraire le contenu des lignes entre test et ], ça marche bien, mais je me demandais si il n'y avait pas un code plus simple ou plus propre :

    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
     
     
    BEGIN {
    FS=" "
    variableDebut="test"
    variableFin="]"
    taille=length(variableDebut)
    }
     
    {indice1 =""
    indice2 =""
    indice1 = match($0, variableDebut) 
    indice2 = match($0, variableFin)
    if (indice1){ 
       ligne=substr($0,indice1+taille,indice2-indice1-taille)
       print ligne
    }
    }
     
    END {
    }
    dssq
    dsqsdsfq dfqf q fdqs
    cxxc
    uoi
    dsd
    fgg

    Merci d'avance.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,

    Oui, comme par exemple:
    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
    $ cat texte.txt 
    Texte :1abc1231dfdffdfd dfdfdfdf dezaedqsc test dssq]dsqdq
    2zxs test dsqsdsfq dfqf q fdqs] 
    3qfsdf
    4qfdqxc
    5test cxxc]
    6abc123 6sdsq
    7cxwxcxw
    8testuoi]
    9fdfdqfdqf
    10dsffdfd  test dsd]sdss
    11qfqffq qdsq qssq qf qsf qsf qf qsdrzadsqtestfgg]f
    $ awk 'match($0,/test *([^]]*) *]/,a) && $0=a[1]' texte.txt 
    dssq
    dsqsdsfq dfqf q fdqs
    cxxc
    uoi
    dsd
    fgg
    Un petit complément d'information sur awk par rapport à ce qu'a dit becket:
    Le bloc BEGIN et END ne sont pas obligatoire si on ne les utilise pas.
    De plus BEGIN et END s’exécute respectivement au tout début et en toute fin du flux (qui peut-être une suite de plusieurs fichiers), sous gawk, il existe 2 autres blocs:
    BEGINFILE et ENDFILE qui eux s’exécute respectivement a chaque début et à chaque fin de fichier.
    Cordialement.

  7. #7
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour votre aide.
    J'ai encore un peu de mal avec les raccourcis, Je vais travailler cela.

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

Discussions similaires

  1. Afficher une certaine ligne d'un fichier texte.
    Par lostsoul dans le forum Général Java
    Réponses: 6
    Dernier message: 18/11/2013, 03h33
  2. Afficher certaines lignes d'un fichier
    Par AJ_ing dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 01/09/2012, 14h21
  3. comment afficher certaine donnée d'un fichier xml
    Par cyberfilou dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 29/04/2007, 22h38
  4. Supprimer certaines lignes d'un fichier texte
    Par kek_net dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2006, 11h21
  5. Afficher les lignes d'un fichier
    Par pepere73 dans le forum C++
    Réponses: 16
    Dernier message: 21/02/2005, 22h25

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