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 :

recuperer valeur "wc -l" et l'utiliser pour faire un calcul


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut recuperer valeur "wc -l" et l'utiliser pour faire un calcul
    Bonjour,
    Je sollicite votre aide dans un script shell que je suis en train de faire...

    Déjà voici le script

    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
    #!/bin/bash
     
    #nombre de ligne de la BD 
    cat  $1 | wc -l > nbligne 
     
    #ne prend que le parametre d'entrée numéro 1
    cut -d " " -f 1 bdfinale.smi > bdcutfinale.smi 
     
    #nb de O
    i=1
     
    if [ "$i" -le 4 ]
    then
    	awk -F '[Oo]' "NF-1 == $i"  bdcutfinale.smi  > bdO$i
            cat  bdO$i | wc -l > nbligneO$i
     
            let 'nbO=nbligneO"$i" - nbligne'
            echo 'le nombre de molecule avec' "$i" 'O est de : ' $nbO
            let 'i="$i"+1'
    fi
    Que fait le script alors il doit compter le nombre de ligne d'un fichier $1 et stocker cette valeur
    Puis ensuite j'ai un fichier *.smi avec plusieurs colonnes, je ne prends que la 1ere.
    Ensuite je fais une boucle allant de i a 4 me permettant de calculer le nombre de ligne avec 1 O.
    Pourquoi 4 ? Car je sais que je n'ai pas plus de 4 O par ligne.

    Il compte le nombre de ligne et retire ces lignes du fichier.
    je compte le nombre de ligne du fichier restant et je le soustrait au nombres de lignes totaux.
    J'ai ainsi le nombre de ligne avec seulement 1 fois le caractère O.

    Ensuite je passe à i+1 et je répète avec le nombre de 0 égale à 2...
    Et ainsi de suite...


    En gros mon probléme se situe à cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let 'nbO=nbligneO"$i" - nbligne'
    en effet j'ai fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bash -x :/testscript blabla.smi
    afin de débugger le code et c'est à cette ligne que le programme bloque avec cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line 17: let: nbO=nbligneO$i - nbligne: syntax error in expression (error token is "$i - nbligne")
    Je viens demander votre aide

    De plus ma ligne est-elle juste ?
    Merci
    Cédric

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    De plus ma ligne
    Code :
    let 'i="$i"+1'
    est-elle juste ?
    non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=3
    let "i=$i+1"
    echo "$1"
    4
    tu peux essayer l'Evaluation Arithmétique de bash
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    tu peux essayer l'Evaluation Arithmétique de bash
    ...
    ?
    Cette expression gere les $
    et les " ' etc....
    [je suis dans le bus du retour]
    je teste ce soir
    Merci

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbligne=$((cat  $1 | wc -l ))
    cela pourrait être correcte ???

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    non, mais ça_a va_a pas !?*
    incrémente nbligne de 1...
    as-tu besoin de l'afficher... avant que le compte soit terminé ?

    *cf. Les Robins des Bois (PeF)
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    non, mais ça_a va_a pas !?*
    incrémente nbligne de 1...
    as-tu besoin de l'afficher... avant que le compte soit terminé ?

    *cf. Les Robins des Bois (PeF)

    Non Non je ne veux pas l'afficher juste stocker la valeur nbligne...
    par contre je comprend pas pourquoi tu incrémentes....

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    j'ai fait un essai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $[var=2+3]
    5: command not found
    J'ai obtenu cela ?
    par contre si je fais j'obtiens bien 5

  8. #8
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonsoir,

    Les explications du problème ne sont pas des plus limpides. Je vais essayer de résumer ce que j'ai compris:
    Il faut compter le nombre de "o" ou "O" dans le premier champ de chaque ligne d'un fichier puis indiquer le nombre de valeurs identiques. Par exemple: "Il y a 3 lignes avec 1 "O", 5 lignes avec 2 "O" et 1 ligne avec 3 "O".

    C'est bien ça? Si c'est le cas, voici une commande qui fait le calcul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    awk '
    {
      size=split($1, t, "[oO]")
      n[size-1]++
    }
    END \
    {
      size=asorti(n, u)
      for (i=1; i <= size; i++)
      {
        print "nb de lignes avec " u[i] " O est: " n[u[i]]
      }
    }' bdfinale.smi
    On peut changer le texte à afficher, avec molécules à la place de lignes.

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    Bonsoir,

    Les explications du problème ne sont pas des plus limpides. Je vais essayer de résumer ce que j'ai compris:
    Il faut compter le nombre de "o" ou "O" dans le premier champ de chaque ligne d'un fichier puis indiquer le nombre de valeurs identiques. Par exemple: "Il y a 3 lignes avec 1 "O", 5 lignes avec 2 "O" et 1 ligne avec 3 "O".

    C'est bien ça? Si c'est le cas, voici une commande qui fait le calcul:

    Oui c'est cela une molécule va être codé en "smiles"
    cest a dire de cette forme la
    ccccCCCO
    ccCCNNNCOoo
    ccccCCCOSSSOOooo
    cccO
    etc...
    c'est totalement faux mais le fichier va ressembler à cela.
    Donc ici je voudrai que le code me dise que j'ai
    2 molécule avec 1 O
    1 molécule avec 3 O
    1 molécule avec 5 O
    etc...
    es ce que je peux remplacer par exemple [Oo] par [c1] ?
    ou c1 est un seul élément

  10. #10
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Le code "[oO]" veut dire: le caractère "o" ou le caractère "O", un seul suffit. S'il faut la suite de caractères "c1", c'est-à-dire le caractère "c" suivi du caractère "1", alors le code sera: "c1". La commande awk que j'ai proposée comptera alors le nombre de fois que les caractères "c1" apparaissent dans la première colonne du fichier.

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    d'accord merci
    j'essaie tout cela demain
    par contre je me demandais comment awk faisait pour différencier Cc et c1
    je veux dire pourquoi awk ne voit pas cela comme si cela était c et/ou 1

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    J'ai testé le code de "jmelyn" qui m'avait l'air moins tordu que le mien

    J'ai obtenu un messae d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    END blocks must have an action part

  13. #13
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    En fait cela fonctionne
    merci tout plein
    par contre
    pourrais tu détailler ton code ?
    De plus si je chercher a n'avoir que "c1"
    cela marche comment ??
    j'ai remplacer oO par c1 et donc la il cherche à la fois c et à la fois 1 ??

  14. #14
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    Pour l'erreur, ce devait être le '\' qui manquait à la fin de la ligne où le mot END apparait.

    Ce code est concis, simple (bon, faut connaître) et très rapide. Comme je l'ai déjà écrit, s'il faut compter le nombre d'apparitions de la chaîne "c1" plutôt que "O" ou "o", dans la commande awk la fonction split($1, t, "[oO]") devient: split($1, t, "c1").

    Explications sur le code de awk. D'abord le programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    awk '
    {
      size=split($1, t, "[oO]")
      n[size-1]++
    }
    END \
    {
      size=asorti(n, u)
      for (i=1; i <= size; i++)
      {
        print "nb de lignes avec " u[i] " O est: " n[u[i]]
      }
    }' bdfinale.smi
    Il est ici divisé en deux parties. La première, située entre les deux premières accolades {}, est exécutée à chaque ligne du fichier, et la seconde après le mot END, est exécutée après que tout le fichier a été lu.

    Il y a seulement deux commandes dans la première partie, mais elles sont un peu complexes.

    • La fonction split($1, t, "[oO]") découpe en morceaux le premier champ ($1) de la ligne sur laquelle awk travaille et met le résultat dans le tableau t[ ]. Pour le découpage, split() utilise les caractères "o" ou "O". Par exemple, si $1 vaut "1o2345O67", après la fonction split(), t[1]="1", t[2]="2345" et t[3]="67". La variable size donne la taille du tableau, ici 3. Cela veut dire qu'il y a eu 2 (size-1) séparateurs.
    • La seconde commande utilise un nouveau tableau, n[ ], qui incrémente (++ = +1) une case du tableau. Dans notre exemple cela veut dire: une ligne de plus avec 2 séparateurs.


    Lorsque toutes les lignes sont passées, le tableau n[ ] possède dans ses cases le nombre de lignes possédant 1, 2,... n séparateurs. Par exemple, si t[1]=3, c'est qu'il y a 3 lignes avec un seul séparateur. Et si t[3]=7, c'est qu'il y a 7 lignes avec 3 séparateurs. Il reste maintenant à afficher le tableau n[ ]. Pour ce faire, la fonction asorti(n, u) trie les indices du tableau n[ ] et les met dans le tableau u[ ]: Par exemple, le tableau n[ ] ne peut avoir que les cases 1 et 3, les autres cases n'existant pas. Après le tri, u[1]=1, u[2]=3 et size vaut 2. Cela veut dire qu'il y a 2 cases dans n[ ]: la case dont l'indice est 1 (u[1]) et la case dont l'indice est 3 (u[2]). C'est pour cette raison que j'écris deux tableaux imbriqués: n[u[i]].

    Il faut prendre quelques minutes pour se plonger dans ces quelques lignes, mais ça vaut le coup, non?

  15. #15
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

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

    Il faut prendre quelques minutes pour se plonger dans ces quelques lignes, mais ça vaut le coup, non?
    Oui énormement
    merci tout plein

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

Discussions similaires

  1. Interprétation des valeurs NULL et '' (double quotes)
    Par thatsallfunk dans le forum Administration
    Réponses: 2
    Dernier message: 09/01/2009, 16h21
  2. [sgbd] Recuperer valeurs d'un Select dans un tableau
    Par Mu_Belier dans le forum SGBD
    Réponses: 16
    Dernier message: 27/05/2005, 16h46
  3. [DateTimePicker]Recuperation valeur date
    Par jane2002 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 11/02/2003, 12h29

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