#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,
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
$
Hors ligne
#4 Le 19/02/2013, à 12:07
- claudius01
Re : commandes shell calcul mathématique tableau[Résolu]
$ 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)
Hors 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 , merci credenhill et merci pingouinux pour toutes vos réponses
.
Hors ligne