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 :

Division et somme sur la même ligne


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut Division et somme sur la même ligne
    Bonjour,

    comment je peux calculer un rapport puis sommer ce rapport pour chaque ligne d'un fichier,
    mes données sont sous format :

    P() = 0.154597 prob = -0.81 cas = 1
    P() = 0.0268225 prob = -1.50 cas = 2
    P() = 6.14752e-10 prob = -9.20 cas = 3-2
    je veux diviser la valeur du champ prob par le dernier caractère (plutôt l'avant dernier sans /n) je récupère dernier caractère par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $ligne | tail -c 2
    la somme est calculée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val=$( { { echo 'scale=20;' ; cat $fic ; } | sed -e 's|.*= *\(.*\) cas.*|\1 +|' | tr '\n' ' ' ; echo '1' ; } | bc -l)
    j'arrive pas à combiner les deux dans même traitement
    merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    Bonjour,

    c'est toi qui formate ces fichiers, ou c'est un programme ?
    n'y a-t-il pas moyen d'obtenir un fichier csv ? c'est pénible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk -F';' '{gsub(/ *[a-z]+ = /,";");gsub("^P\(\) = ","");sub("[^-]*-","",$3);s+=$2/$3}END{print s}' tonFichier
    -6.16

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    merci ,non c'est un programme,
    j'ai ce message d'erreur
    awk: warning: escape sequence `\(' treated as plain `('
    awk: warning: escape sequence `\(' treated as plain `('

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    ah! il y a une légère différence de traitement des parenthèses entre gawk et mawk...
    enlève simplement les anti-slashes (sub("^P() = ","")).

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    Merci N_Bah
    j'ai un petit souci, à l'intérieur des () de P j'ai ça
    P( a | b, c,.. )
    a et b peuvent être des lettres ou des chiffres ou ponctuation
    par exemple je peux avoir ça :
    P( r | s# n s <UNK> U ) = 0.015 prob = -1.821900 cas= 6x5x4x3-2
    donc le contenu de P varie et la fin de la chaine cas aussi
    alors j'ai cette erreur
    (standard_in) 377: illegal character: P
    (standard_in) 377: illegal character: |

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    je n'arrive pas à reproduire ces erreurs
    essaye ainsi :sub("^P([^)]*) = ","")on enlève tout entre P( et ) compris
    ...
    ?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    non même erreur :

    (standard_in) 57: illegal character: P
    (standard_in) 57: illegal character: |
    (standard_in) 57: illegal character: I

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    hmm
    n'y aurait-il pas des caractères invisibles ?
    peux-tu nous télécharger un fichier de quelques lignes représentatives ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut


    P( n | ) = 0.0552205 prob = -1.257900 case = 1
    P( ' | n ) = 0.00959622 prob = -2.017900 case = 2
    P( a | n ' ) = 2.58881e-05 prob = -4.586900 case = 3-2
    P( r | U s# t ' a ) = 0.0548151 prob = -1.261100 case = 6x5x4x3
    P( s# | a C h e r ) = 0.130948 prob = -0.882900 case = 6x5-4
    P( n | C h e r s# ) = 0.0177746 prob = -1.750200 case = 6x5
    P( s | h e r s# n ) = 5.27351e-05 prob = -4.277900 case = 6-5-4-3-2
    P( U | r s# n s <UNK> ) = 7.95609e-07 prob = -6.099300 case = 6x5x4-3-2-1
    ou bien, je dois réfléchir autrement, par exemple, je crée un fichier intermédiaire dans le quel je met prob/ dernier caractère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while read $ligne 
    				do	
                                    c=$(echo $ligne | tail -c 2)
    			        p=$(echo $ligne |sed -e 's|.*= *\(.*\) case.*|\1 /'$c'|' | bc -l)
                                    echo "prob = $p cas = " >> newfich										 
       			        done < fich
    dans new fichier, j'ai que prob = cas = sans $p
    puis je fais le calcul de la somme avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val=$( { { echo 'scale=20;' ; cat $fic ; } | sed -e 's|.*= *\(.*\) cas.*|\1 +|' | tr '\n' ' ' ; echo '1' ; } | bc -l)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    pour pouvoir tester ton fichier, il faudrait que tu nous télécharges un fichier joint (voir plus bas : Fichiers attachés /Gérer les pièces jointes)

    au vu de l'échantillon présenté, il faut adapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk -F';' '{gsub(/ *[a-z]+ *= /,";");sub("^P([^)]*) = ","");$3=substr($3,length($3));s+=$2/$3}END{print s}' tonFichier
    -13.7897

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut

    awk: (FILENAME=p2anfic200 FNR=296) fatal: division by zero attempted
    (standard_in) 1: syntax error
    Fichiers attachés Fichiers attachés

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    c'est très bizarre.
    pour moi, autant avec gawk que mawk, ceci fonctionne très bien :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    awk -F';' '{gsub(/ *[a-z_]+ *= /,";");sub("^P([^)]*) = ","");$3=substr($3,length($3));print "s+="$2"/"$3; s+=$2/$3}END{print s}' test.txt
    s+=-1.257900/1
    s+=-2.017900/2
    s+=-4.586900/2
    s+=-1.261100/3
    s+=-0.579200/4
    s+=-2.042700/4
    s+=-8.437900/1
    s+=-1.688400/2
    s+=-1.699600/3
    s+=-4.604300/3
    s+=-2.994500/2
    s+=-1.261100/3
    s+=-1.596200/3
    s+=-0.769500/4
    s+=-9.023600/2
    s+=-1.003000/2
    s+=-1.229900/3
    s+=-0.908000/4
    s+=-0.882900/4
    s+=-1.750200/5
    s+=-4.277900/2
    s+=-6.099300/1
    s+=-1.821900/2
    s+=-0.795900/3
    s+=-2.385400/3
    s+=-0.472400/4
    s+=-0.233700/5
    s+=-2.927400/5
    s+=-4.106500/3
    s+=-0.729900/2
    s+=-1.541500/3
    s+=-11.314000/1
    s+=-2.819200/2
    s+=-2.555400/2
    s+=-0.937200/3
    s+=-0.807700/3
    s+=-2.826300/4
    s+=-7.716900/1
    s+=-5.445900/1
    -67.5425
    quelle version de awk utilises-tu ?

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    Parfait ,très bien avec le même exemple j'ai un résultat si je teste indépendemment
    , mais dans mon code non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     val=`awk -F';' '{gsub(/ *[a-z]+ *= /,";");sub("^P([^)]*) = ","");$3=substr($3,length($3)); s+=$2/$3}END{print s}' $fich` 
    moy=$(echo "scale=3;$val/$n1 "|bc)
    n1 nombre de ligne
    je peux rajouter NR dans print , mais en testant comme ça j'ai la même erreur

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    FNR=296 indique la ligne du fichier en entrée qui pose problème.
    à quoi ressemblent les lignes 294 à 298 du fichier original ?

    j'avais ajouté un _ dans la regex du gsub.
    je peux rajouter NR dans print
    tout à fait. ce serait même mieux au lieu d'appeler bc ensuite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    END{printf("%.3f\n", s/NR)}

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    awk: {gsub(/ *[a-z_]+ *= /,";");sub("^P([^)]*) = ","");$3=substr($3,length($3)); s+=$2/$3}END{printf("%.3f\n", s/NR)}}
    awk: ^ syntax error
    Sans introduire Nr, le problème vient de ça
    awk: (FILENAME=p2anfic131 FNR=28) fatal: division by zero attempted
    (standard_in) 28: illegal character: |
    (standard_in) 28: illegal character: T
    (standard_in) 28: syntax error
    awk: (FILENAME=p2anfic132 FNR=134) fatal: division by zero attempted
    (standard_in) 134: illegal character: |

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    t'as mis une accolade en trop à la fin !

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    oui pour l'accolade , merci
    mais le problème provient des lignes contenant le séparateur qu'on a fixé ";" , par hazard le fichier test ne contient pas de ; dans P

    P( ; | s# ) = 0.00505243 logprob = -2.296500 bo_case = 2
    je vois pas bien si cette méthode résout le problème puisque les ponctuations peuvent être parmi les caractères de P !!!
    Que voyez vous ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    soit !
    changeons le séparateur par quelque chose qui a peu de chance de se trouver sur une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v sep='-@-@' 'BEGIN{FS=sep}{gsub(/ *[[:alpha:]_]+ *= /,sep);$3=substr($3,length($3));print "s+="$2"/"$3; s+=$2/$3}END{printf("%f / %d = %.3f\n",s,NR,s/NR)}' test.txt
    !

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    Parfait N_baH ,

    Merci pour votre collaboration

  20. #20
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AJ_ing Voir le message
    ou bien, je dois réfléchir autrement, par exemple, je crée un fichier intermédiaire dans le quel je met prob/ dernier caractère
    Salut
    Attention aux fichiers intermédiaires. Toujours réfléchir au pb "que se passe-t-il si mon script est lancé plusieurs fois en même temps".
    En général on arrive à éviter les fichiers intermédiaires en passant par des pipes => cat fichier | traitement1 | traitement2 | ... | traitement final...

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

Discussions similaires

  1. Sur la même ligne mettre du texte à gauche et à droite
    Par Oberown dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 20/06/2007, 15h50
  2. Réponses: 6
    Dernier message: 28/09/2005, 10h24
  3. Aligner du texte à gauche et à droite sur une même ligne ?
    Par pontus21 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/04/2005, 11h25
  4. 2 éléments sur une même ligne
    Par ben_iap dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/11/2004, 17h27
  5. 2 recordset sur la même ligne
    Par gunnm dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/08/2004, 20h36

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