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 :

Nombre de lignes contenant au moins une occurence définie


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 13
    Par défaut Nombre de lignes contenant au moins une occurence définie
    Bonjour,

    Je coince sur ceci question syntaxe dans un script
    Ma condition ne fonctionne pas ....
    Un petit coup de pouce ?

    PS : je ne veux pas utiliser "grep" pour des raisons didactiques. ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    nb=0
    mot=echo
    while read ligne
    do
       if [ expr index $ligne $mot ]; then
          let "nb=nb+1"
       fi
    done < compare
    echo $nb

    Merci d'avance et excellente journée à tous !

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

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

    Si c'est pour apprendre, alors apprends à mettre des double-quotes autour des variables à moins de savoir pourquoi tu ne le fais pas.

    Ensuite, apprends que [ ] est un raccourci pour la commande test. Donc écrire test expr n'a pas de sens puisque tu écris 2 commandes à la suite.
    Pour avoir des précisions sur la commande test, tape help test ou man test.

    Après if, il y a effectivement une commande. Pas besoin de signe de ponctuation comme en C++ ou java ou python ou cætera

    Je ne connaissais même pas cette expression avec let. On peut utiliser aussi:
    Quand au fait de compter les occurrences ... il y a toujours le problème du chevauchement. Combien y a-t-il de fois "toto" dans "tototo" ?

  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,

    Ici, il y a une incompréhension entre l'intitulé de la discussion et le besoin vis à vis de ton script car celui-ci ne comptera au plus qu'une occurrence par ligne...

  4. #4
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 13
    Par défaut
    Merci pour vos remarques constructives.

    Elles m'ont au moins permis de découvrir et comprendre par moi même (test, [[ ]], "$var", ...) sans "copier/coller" idiot ....

    J'en arrive donc à ceci qui fonctionne


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    nb=0
    mot=echo
    while read ligne
    do
        if [[ "$ligne"`=~ "$mot" ]]; then
            let "nb=nb+1"
        fi 
    done < compare
    echo "$nb"
    Juste une petite chose :
    Après if, il y a effectivement une commande. Pas besoin de signe de ponctuation comme en C++ ou java ou python ou cætera
    Si je les omet, il me donne une erreur de syntaxe près du symbole inattendu "then" ... une info ?

    Excellente journée

  5. #5
    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
    Voici une autre syntaxe bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mot="echo"
    nb=0
    while read ligne
    do 
       [[ "$ligne" =~ "$mot" ]] && ((nb++))
    done <bobo.txt
    echo $nb

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Développons:

    On peut mettre n'importe quelle commande derrière if. Cette commande renvoie vrai (0) ou faux (1->255, code erreur). Et ceci est interprété par if.
    Sans if, on affiche le résultat de la dernière commande par:
    Une expression numérique n'est pas une commande. Voilà pourquoi il te renvoie une erreur. Tu dois mettre test ou des crochets, simples ou doubles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ if grep -q sucre *.txt; then echo OK;else echo KO;fi
    OK
    $ if grep -q toto *.txt; then echo OK;else echo KO;fi
    KO
    $ if gimp; then echo OK;else echo KO;fi
    OK
    $ if test 5 -eq 0; then echo OK;else echo KO;fi
    KO
    $ if test $((5-2-3)) -eq 0; then echo OK;else echo KO;fi
    OK
    $
    Dans mon dossier, j'ai des fichiers textes comme des recettes de cuisine (contenant "sucre") mais ils ne contiennent pas "toto".
    Le logiciel de retouche photo gimp s'est terminé sans erreur.
    5 n'est pas égal à 0 mais 0 est égal à 5-2-3.

  7. #7
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 13
    Par défaut
    Un tout grand merci à tous pour votre patience !!!!!

  8. #8
    Expert confirmé 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 : 48
    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
    Par défaut
    Citation Envoyé par mamour Voir le message
    Bonjour,

    Je coince sur ceci question syntaxe dans un script
    Ma condition ne fonctionne pas ....
    Un petit coup de pouce ?

    PS : je ne veux pas utiliser "grep" pour des raisons didactiques. ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    nb=0
    mot=echo
    while read ligne
    do
       if [ expr index $ligne $mot ]; then
          let "nb=nb+1"
       fi
    done < compare
    echo $nb

    Merci d'avance et excellente journée à tous !

    si je me base sur ta demande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_lignes_contenant_mot=$(sed '/mot/ !d' fichier_a_analyser | wc -l)
    évitera les boucles inutiles


    y'a bien 3 lignes qui matchent au moins 1 fois chacune le mot titi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    francois@baal:~$ mot=titi
    francois@baal:~$ echo toto toto toto toto titi toto toto toto titi toto >> a
    francois@baal:~$ echo toto toto toto toto titi toto toto toto titi toto >> a
    francois@baal:~$ echo toto toto toto toto titi toto toto toto titi toto >> a
    francois@baal:~$ echo >> a
    francois@baal:~$ nb=$(sed '/'${mot}'/ !d' a | wc -l) ; echo $nb
    3
    francois@baal:~$ 
    francois@baal:~$ rm a

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/10/2015, 21h26
  2. Comptage du nombre de ligne contenant une occurence
    Par ninsekh dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 27/07/2010, 14h16
  3. Calcul du nombre de lignes en fonction d'une condition
    Par didier roustand dans le forum Débutez
    Réponses: 7
    Dernier message: 27/01/2010, 18h32
  4. nombre de lignes contenant une colonne dans une feuille
    Par bonanos dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/07/2009, 16h43
  5. [E-07] copier la ligne si au moins une cellule est vide
    Par jawed dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 24/10/2008, 16h29

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