Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails)

#1 Le 19/02/2013, à 12:14

sab113

commandes shell calcul mathématique tableau[Résolu]

Bonjour à tous,

J'aimerais sollicité votre aide : j'ai un fichier contenant 3 colonnes et par exemple 3 termes.
rang   terme     poids
0        terme1   0.6
1        terme2   0.5
2        terme3   0.3

Mes termes sont rangés par ordre décroissant de leurs poids, le premier terme a le poids le plus élevé. je voudrais en faite faire un petit calcul et ça me prends du temps puisque mon fichier est vraiment grand et j'ai pas assez de temps pour terminer les calcul.

pour chaque terme exemple:
le calcul du poids est (terme1)=  (poids / poids maxim)*((rang+1)/nombre de terme)
donc:
0  terme1   (0.6/0.6)*((0+1/3)=0.33
1   terme2   (0.5/0.6)*((1+1)/3)=0.55
2  terme3     (0.3/0.6)*((2+1)/3)=0.5
..........
j'aimerais faire ce calcul sous commande. Pourriez vous svp m'aidez.
Je vous remercies à l'avance.

Dernière modification par sab113 (Le 19/02/2013, à 18:59)

Hors ligne

#2 Le 19/02/2013, à 12:45

claudius01

Re : commandes shell calcul mathématique tableau[Résolu]

Bonjour,

sab113 a écrit :

Pourriez vous svp m'aidez.

Avec 'awk' (qui revient à écrire du C) dans un script, cela devrait le faire (avec les données fournies) :

$ ./poids.sh poids.txt
nbr_termes [3.000000]
poids_max  [0.600000]
rang 0: 0.600000 => 0.33
rang 1: 0.500000 => 0.56
rang 2: 0.300000 => 0.50

Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 19/02/2013, à 12:50)

Hors ligne

#3 Le 19/02/2013, à 12:57

credenhill

Re : commandes shell calcul mathématique tableau[Résolu]

hello

$ awk 'NR<2{m=$3} {x=($3/m)*(($1+1)/3); printf "%s %.2f\n", $0, x}' fichier
0        terme1   0.6 0.33
1        terme2   0.5 0.56
2        terme3   0.3 0.50
$ 

Hors ligne

#4 Le 19/02/2013, à 13:07

claudius01

Re : commandes shell calcul mathématique tableau[Résolu]

credenhill a écrit :

$ awk 'NR<2{m=$3} {x=($3/m)*(($1+1)/3); printf "%s %.2f\n", $0, x}' fichier

Objection votre honneur ... (($1+1)/3) avec 3 en dur ;-)

Ma version qui tient en plus d'une ligne, que j'admire au demeurant :

#!/bin/ksh

if [ $# -lt 1 ]; then
  echo "Usage: $0 <file>"
  exit 2
fi

file=$1

nbr_termes=`wc -l $file | awk '{print $1}'`
poids_max=`head -1 $file | awk '{print $3}'`

awk -v nbr_termes=${nbr_termes} -v poids_max=${poids_max} '
BEGIN {
  printf("nbr_termes [%f]\n", nbr_termes);
  printf("poids_max  [%f]\n", poids_max);
  rang=0
}
{
  if (poids_max > 0) {
    poids=($3 / poids_max) * ((rang + 1) / nbr_termes);
    printf("rang %d: %f => %.2f\n", rang++, $3, poids);
  }
  else {
    printf("Error: Invalid 'poids_max' (%f)\n", poids_max);
    exit
  }
}
' $file

exit 0

Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 19/02/2013, à 13:10)

Hors ligne

#5 Le 19/02/2013, à 13:14

credenhill

Re : commandes shell calcul mathématique tableau[Résolu]

dur dur 3 en dur, effectivement

$ awk '{t[NR]=$0} END{while(++n<=NR){$0=t[n]; if(n==1)m=$3; x=($3/m)*(($1+1)/NR); printf "%s %.2f\n", $0, x}}' fichier
0        terme1   0.6 0.33
1        terme2   0.5 0.56
2        terme3   0.3 0.50
$ 

Dernière modification par credenhill (Le 19/02/2013, à 13:47)

Hors ligne

#6 Le 19/02/2013, à 13:24

pingouinux

Re : commandes shell calcul mathématique tableau[Résolu]

Bonjour,
Une solution en bash, un peu plus longue

#!/bin/bash

fichier="$1"
nval=$(( $(wc -l "$fichier" | cut -d" " -f1) - 1))

while read rang terme poids
do
   [[ $rang == 0 ]] && maxim=$poids
   val=$(bc -l <<<"($poids/$maxim)*($rang+1)/$nval")
   printf "%3d %-8s %.3f => %.3f\n" $rang $terme $poids $val
done < <(tail -n +2 "$fichier")

En ligne

#7 Le 19/02/2013, à 16:36

sab113

Re : commandes shell calcul mathématique tableau[Résolu]

Merci pour votre aide,
j'avais essayé d'ajouter un séparateur de champ "|" au lieu de l'espace car ya certains mots composés auquel je ne peux pas avoir le poids. C'est à dire que mes colonnes sont séparés par le |.
rang|terme|poids
0 |terme1|0.9
1 |terme2| 0.5
2 |terme3| 0.3
..........
donc j'ai ajouté aux commandes awk : -F '|'

nbr_termes=`wc -l $file | awk  -F '|' '{print $1}'`
poids_max=`head -1 $file | awk -F '|' '{print $3}'`

Mais sa ne marche pas ?

Hors ligne

#8 Le 19/02/2013, à 17:12

claudius01

Re : commandes shell calcul mathématique tableau[Résolu]

sab113,

L'argument -F '<separator>' de awk ne doit s'appliquer qu'aux 2 seules lignes :

poids_max=`head -1 $file | awk -F '|' '{print $3}'`

et

awk -F '|' -v nbr_termes=${nbr_termes} -v poids_max=${poids_max} '

Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 19/02/2013, à 17:13)

Hors ligne

#9 Le 19/02/2013, à 18:59

sab113

Re : commandes shell calcul mathématique tableau[Résolu]

Merci  claudius01 smile, merci credenhill et merci pingouinux pour toutes vos réponses smile.

Hors ligne

Haut de page ↑