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 :

[awk] Récupérer le nombre de ligne total de la variable NR


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut [awk] Récupérer le nombre de ligne total de la variable NR
    Bonjour,

    je me casse la tête depuis ce matin sur un truc qui je pense est simple mais dont j'ai beau retourné dans tout les sens je n'arrive pas à avoir le résultat que je veux.

    En gros voici mon problème, j'ai un fichier comme l'/etc/passwd sous linux dont je souhaite afficher toute les ligne sauf la dernière, je sais c'est basique et il y a de multiple façon de le faire simplement mais si je suis ici c'est parce que je veux le faire avec une certaine manière

    Je voudrais donc pourvoir faire cette opération en utilisant la variable NR de awk, du style :

    1) Connaitre le nombre de ligne avec NR
    2) Faire une boucle du style "tant que i < NR; afficher la ligne; ++i"

    Le problème est que NR n'affiche le total que si on lui met un END à la fin, donc si je fais ma boucle ça va afficher plusieurs fois la même chose à chaque énumération de la la ligne. Par conséquent est-il possible de récupérer le total de la variable NR dès le début et de l'utiliser comme nombre fixe pour faire la boucle ?

    Concrètement j'ai un fichier toto de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ligne1
    ligne2
    ligne3
    ligne4
    ligne5
    si je fais une boucle ça donne ça :

    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 /tmp/plik |awk  '{i=0; while (i < NR) {print; i++;}}'
    ligne1
    ligne2
    ligne2
    ligne3
    ligne3
    ligne3
    ligne4
    ligne4
    ligne4
    ligne4
    ligne5
    ligne5
    ligne5
    ligne5
    ligne5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # cat /tmp/plik |awk  '{print NR}'
    1
    2
    3
    4
    5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # cat /tmp/plik |awk  'END {print NR}'
    5
    ce que je voudrais c'est ça:

    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #<super awk de la mort qui tue> NR ?
    ligne1
    ligne2
    ligne3
    ligne4


    Je ne sais pas si c'est faisable ?

    Merci d'avance.

  2. #2
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Si vraiment tu as besoin de faire une boucle, alors tu remplis un tableau avec le contenu de ton fichier, et arrivé à END, tu travailles avec (et avec NR ayant la bonne valeur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{a[NR]=$0} END{for (i=1;i<NR;i++) print a[i]}' fichier
    S'il s'agit juste d'afficher toutes les lignes sauf la dernière, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR>1{print line} {line=$0}' fichier

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

    Un truc comme ceci peut être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     awk ' BEGIN { getline test < "/etc/passwd" }  { if ( getline test < "/etc/passwd" != 0 ) { print  $0   }   }' /etc/passwd

  4. #4
    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
    Une méthode rustique pour afficher toutes les lignes sauf la dernière (fonctionne au moins en gawk) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{p=c ; c=$0} $0=p' fichier

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    D'abord, si quelqu'un passe par ici et se demande, la façon simple de faire est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{p=c ; c=$0} $0=p' fichier
    Un script qui a la vertu de supprimer les lignes vides par la même occasion .

  6. #6
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut
    Merci à tous pour vos réponses, la méthode de Balakany correspond exactement à ce que je voulais

    Par contre j'aimerais comprendre comment ce que la commande fait exactement ?

    Celui-ci j'ai compris et je le trouve très élégant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{a[NR]=$0} END{for (i=1;i<NR;i++) print a[i]}' fichier
    Par contre celui-ci malgré la simplicité de sa syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR>1{print line} {line=$0}' fichier
    De ce que je comprends awk lit le fichier, énumère chaque lignes lues mais au lieu de commencer par la ligne 1 et il commence par la ligne 2, ensuite il les affiche, mais je comprends pas comment il substitue dans l'exemple ci-dessous la ligne2 avec la ligne1 ? Comment ce décalage a pu se faire ? c'est une sorte de "shift" comme en shell ?

    # cat /tmp/plik  |awk 'NR>1 {print NR, $0}'
    2 ligne2
    3 ligne3
    4 ligne4
    5 ligne5
    # cat /tmp/plik  |awk 'NR>1 {print NR, ligne}{ligne=$0}'
    2 ligne1
    3 ligne2
    4 ligne3
    5 ligne4

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

Discussions similaires

  1. Récupérer le nombre de lignes totales d'une datatable
    Par Jordan-Tess dans le forum jQuery
    Réponses: 6
    Dernier message: 27/11/2014, 14h27
  2. Réponses: 2
    Dernier message: 20/03/2007, 13h39
  3. [MySQL] Récupérer le nombre de lignes
    Par popogendarme dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 31/01/2007, 15h20
  4. Réponses: 3
    Dernier message: 27/09/2006, 11h35
  5. [javascript/dom] Récupérer le nombre de lignes d'un tableau
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/02/2006, 11h51

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