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 :

Ecart type avec awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre très actif
    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
    Par défaut Ecart type avec awk
    Salut,

    j'ai voulu utiliser awk pour calculer la moyenne et l'écart type ( sqrt de la variance) de chaque champ , voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     awk '{ pp+= $2;var1+= $3;var2+= $4;oov+= $5 } END { print $h,"fr",pp/NR,var1/NR,var2/NR,oov/NR}' fich > ppfr  #moy
     
    awk '{ ps+= $2;pp+= $2*$2;2gs+= $3;2gp+= $3*$3;1gs+= $4;1gp+= $4*$4;oovs+= $5;oovp+= $5*$5} END { print $h,"fr",sqrt(pp-(ps/NR)*(ps/NR)),sqrt(2gp-(2gs/NR)*(2gs/NR)),sqrt(1gp-(1gs/NR)*(1gs/NR)),sqrt(oovp -(oovs/NR)*(oovs/NR))}' fich >>ppfr  #std
    j'ai cette erreur de syntaxe :
    awk: { ps+= $2;pp+= $2*$2;2gs+= $3;2gp+= $3*$3;1gs+= $4;1gp+= $4*$4;oovs+= $5;oovp+= $5*$5} END { print $h,"fr",sqrt(pp-(ps/NR)*(ps/NR)),sqrt(2gp-(2gs/NR)*(2gs/NR)),sqrt(1gp-(1gs/NR)*(1gs/NR)),sqrt(oovp -(oovs/NR)*(oovs/NR))}
    awk: ^ syntax error
    Est ce vous pouvez me dire c'est quoi mon erreur , je débute avec awk
    merci d'avance

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Les variables awk ne peuvent commencer par [0-9]. Ta variable 2gp produit logiquement une erreur.

    nb: Pourquoi passer deux fois dans le fichier? Un seule fois devrait suffire pour calculer la moyenne et la variance non?

  3. #3
    Membre très actif
    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
    Par défaut
    oui c'est ça ma faute
    Les variables awk ne peuvent commencer par [0-9]
    oui c'est juste je testais chaque resultat à part pour vérifier

    Merci pour votre aide

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Ton code peut s'optimiser. Il me semble que tu te compliques la vie pour rien.

    Exemple, fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var1 1 5 8
    var2 2 4 5 1
    var3 52 18 16 68 18 16 76
    Calcul de la moyenne et écart-type pour chaque ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{t=v=s=0;for(i=2;i<=NF;i++) t+=$i; m=t/(NF-1); for(i=2;i<=NF;i++) s+=($i-m)^2; print $1,m,sqrt(s/(NF-1))}' fichier
    Sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var1 4.66667 2.86744
    var2 3 1.58114
    var3 37.7143 24.8062
    Tout est calculé en une passe. Économie de temps et de ressources, surtout pour de gros fichiers.

  5. #5
    Membre très actif
    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
    Par défaut
    c'est bien ça , il est "fort" awk

    Mais je dois faire le calcul de la moyenne et écart-type pour chaque colonne
    ça change , je dois parcourir tt les lignes pour chaque colonne ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{t=v=s=0;for(j=2;j<=NF;j++) {for(i=1;i<=NR;i++) t+=$j; m=t/(NR)};for(j=2;j<=NF;j++){for(i=1;i<=NR;i++) s+=($j-m)^2}; print m,sqrt(s/(NR))}'

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Montre-nous un extrait du fichier d'entrée. s'il est organisé en colonnes, la logique est différente.

  7. #7
    Membre très actif
    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
    Par défaut
    voici un extrait de mes données :
    frfic1 12.81 99.56 0.44 0.00
    frfic10 14.18 99.56 0.44 0.00
    frfic11 13.25 99.56 0.44 0.00
    frfic12 12.81 99.57 0.43 0.00
    frfic13 14.28 99.56 0.44 0.00
    frfic14 10.48 100.00 0.00 0.44
    frfic15 10.81 99.55 0.45 0.00
    Bon chaque colonne correspond à une variable , l'objet est d'avoir moyenne et ecart type par variable


    Merci

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Dans ce type de disposition des données, le plus simple est effectivement passer deux fois dans le fichier mais, de manière plus concise:

    One liner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'FNR==NR {for(i=2;i<=NF;i++) s[i]+=$i;nb+=1;next}{for(i=2;i<=NF;i++) v[i]+=($i-s[i]/nb)^2}END{for(i=2;i<=NF;i++) print "col"i, s[i]/nb, sqrt(v[i]/nb)}' fichier fichier
    Plus lisible:
    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
    # premier passage: on somme les valeurs des colonnes et compte le nbre de lignes
    FNR==NR {
    	for(i=2;i<=NF;i++) s[i]+=$i
    	nb+=1
    	next
    }
     
    # deuxième passage: somme des variances
    {
    	for(i=2;i<=NF;i++) v[i]+=($i-s[i]/nb)^2
    }
     
    # impression des résultats
    END {
    	for(i=2;i<=NF;i++) print "col"i, s[i]/nb, sqrt(v[i]/nb)
    }
    Il serait possible de ne passer qu'une seule fois dans le fichier en utilisant un tableau multi-dimensionnel mais ça consommera pas mal de mémoire. Ce qu'on gagnerait en une seule lecture du fichier serait consommé en mémoire. C'est un choix. De plus, la gestion des tableaux multi en awk est assez pénible.

  9. #9
    Membre très actif
    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
    Par défaut
    Merci bien

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

Discussions similaires

  1. Ecart type avec condition
    Par Maady dans le forum Excel
    Réponses: 7
    Dernier message: 22/10/2018, 18h47
  2. [Débutant] nuage de points avec ecarts types ?
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/11/2011, 01h59
  3. Réponses: 5
    Dernier message: 06/08/2008, 17h40
  4. Probleme avec awk et type de variables
    Par canaboss dans le forum Linux
    Réponses: 6
    Dernier message: 16/04/2008, 21h04
  5. Réponses: 2
    Dernier message: 01/04/2003, 23h09

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