Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/02/2013, à 11: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, à 17:59)

Hors ligne

#2 Le 19/02/2013, à 11: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, à 11:50)

Hors ligne

#3 Le 19/02/2013, à 11: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
$ 

En ligne

#4 Le 19/02/2013, à 12: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, à 12:10)

Hors ligne

#5 Le 19/02/2013, à 12: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, à 12:47)

En ligne

#6 Le 19/02/2013, à 12: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")

Hors ligne

#7 Le 19/02/2013, à 15: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, à 16: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, à 16:13)

Hors ligne

#9 Le 19/02/2013, à 17: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