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éponse variable


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [awk] Réponse variable
    Bonjour,

    Je me suis lancé depuis peu dans l'écriture de script utilisant awk. j'utilise un terminal en bash sous MAC osX. Lorsque j'utilise le script suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    awk 'BEGIN {FS="\t" }
    NR==1 { print "PCSK9",FILENAME }
    NR==86,NR==93 { if ($12~/not/) print $14,""
     else if ($8~/he/) print $14,"1" 
     else if ($8~/ho/) print $14,"2" }
    NR==94 { if ($12~/not/) print $14,""
     else if ($8~/he/ && $9!~(/^6/ || /^7/)) print $14,"1" 
     else if ($8~/ho/) print $14,"2" 
     else if ($8~/he/ && $9~(/^6/ || /^7/)) print $14,"" }
    NR>=95 { if ($12~/not/) print $14,""
     else if ($8~/he/) print $14,"1" 
     else if ($8~/ho/) print $14,"2" }
    END {  } ' $patientHaplo > /Volumes/DATA/Bioinf/Execute/HaploGS/Temp/tempPCSK9.txt
    la réponse pour la ligne 94 est parfois "1" et parfois "" sans que j'arrive à expliquer pourquoi. Je suppose que la réponse doit être trop évidente pour que je la voie. J'ai mis 2 fichiers en exemple.
    Merci de bien vouloir m'éclairer.
    Fichiers attachés Fichiers attachés

  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 392
    Points
    19 392
    Par défaut
    Bonjour,

    il me semble qu'il y a une erreur de syntaxe pour les lignes 86 et 93 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for v in 12 45 11; do awk -v var="$v" '{print var}var==11,var==45{print "ok"}var==12{print "r
    eOK"}' <<<abc; done
    12
    reOK
    45
    11
    ok
    cela peut-il gêner la lecture de la ligne 94 ?...

    mais, que veux-tu faire ? un OU logique ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for v in 12 45 11; do awk -v var="$v" '{print var}var==11||var==45{print "ok"}var==12{print "reOK"}' <<<abc; done
    12
    reOK
    45
    ok
    11
    ok
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Salut,
    Il me semble que :
    Sera interprété ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $9!~($0 ~ /^6/ || $0 ~ /^7/)
    Enfin, je ne suis pas certain...
    Mais tu devrais plutôt l'écrire comme ça :

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Impossible que tu réussisses à passer la condition de la ligne 9 puisque c'est la même que la ligne 7.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Postmortem Voir le message
    Salut,
    Il me semble que :
    Sera interprété ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $9!~($0 ~ /^6/ || $0 ~ /^7/)
    Enfin, je ne suis pas certain...
    Mais tu devrais plutôt l'écrire comme ça :
    Ca fonctionne parfaitement, merci beaucoup, il faut bien avouer que je ne maitrise pas du tout la syntaxe, je ne "code" que depuis 1 semaine. Ceci dit, je comprends bien que awk est passé ma condition dans un cas parce qu'il n'arrivait pas à la trouver mais pas qu'il fasse la bonne interprétation dans l'autre cas. C'est pas très grave, je pense que je comprendrai avec un peu plus d'expérience.

  6. #6
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Après quelques vérifications et recherches, j'ai retrouvé un cas plus ou moins semblable au tient expliqué dans la doc de gawk ici.

    Lorsque tu fais $9!~(/^6/ || /^7/), cela équivaut à $9 !~ ( $0 ~ /^6/ || $0 ~ /^7/ ).

    L'expression ( $0 ~ /^6/ || $0 ~ /^7/ ) est vraie si la ligne commence par 6 ou 7. Donc, si la ligne commence par 6 ou 7, l'expression ($0 ~ /^6/ || $0 ~ /^7/) vaut 1 ; si la ligne commence par autre chose, l'expression vaut 0.

    Et donc, quand tu fais $9!~(/^6/ || /^7/), ça veut dire :
    • Si la ligne commence par 6 ou 7 : si le champs 9 ne contient pas 1 : $9 !~ 1
    • Si la ligne commence par autre chose que 6 ou 7 : si le champs 9 ne contient pas 0 : $9 !~ 0


    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk -F \; '$2!~(/^6/ || /^7/) {print $0}' <<<'col1;col2'
    col1;col2 # la ligne commence par autre chose que 6 ou 7 ; (/^6/ || /^7/) vaut donc 0 ; il n'y a pas de 0 dans le champ 2 donc on affiche la ligne
     
    $ awk -F \; '$2!~(/^6/ || /^7/) {print $0}' <<<'6 col1;col2'
    6col1;col2 # la ligne commence par 6 ou 7 ; (/^6/ || /^7/) vaut donc 1 ; il n'y a pas de 1 dans le champ 2 donc on affiche la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk -F \; '$2!~(/^6/ || /^7/) {print $0}' <<<'col1;col2 avec un 0'
    $ # la ligne commence par autre chose que 6 ou 7 ; (/^6/ || /^7/) vaut donc 0 ; il y a un 0 dans le champ 2 donc on n'affiche rien
     
    $ awk -F \; '$2!~(/^6/ || /^7/) {print $0}' <<<'6 col1;col2 avec un 0'
    6col1;col2 avec un 0 # la ligne commence par 6 ou 7 ; (/^6/ || /^7/) vaut donc 1 ; il n'y a pas de 1 dans le champ 2 donc on affiche la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk -F \; '$2!~(/^6/ || /^7/) {print $0}' <<<'col1;col2 avec un 1'
    col1;col2 avec un 1 # la ligne commence par autre chose que 6 ou 7 ; (/^6/ || /^7/) vaut donc 0 ; il n'y a pas de 0 dans le champ 2 donc on affiche la ligne
     
    $ awk -F \; '$2!~(/^6/ || /^7/) {print $0}' <<<'6 col1;col2 avec un 1'
    $ # la ligne commence par 6 ou 7 ; (/^6/ || /^7/) vaut donc 1 ; il y a un 1 dans le champ 2 donc on n'affiche rien

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

Discussions similaires

  1. awk et variable de shell
    Par Melvine dans le forum Shell et commandes POSIX
    Réponses: 1
    Dernier message: 24/09/2012, 10h59
  2. Aide awk avec variable
    Par TinyJimbo dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/09/2010, 20h45
  3. AWK et variables
    Par Nayas dans le forum Linux
    Réponses: 1
    Dernier message: 15/02/2008, 22h07
  4. Réponses: 4
    Dernier message: 10/01/2006, 14h53
  5. Awk et variables
    Par Fabien Celaia dans le forum Linux
    Réponses: 2
    Dernier message: 15/06/2004, 11h31

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