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 42 43 44 45 46 47 48 49 50 51
| #!/bin/bash
fGroups=groupes.txt
abs() {
echo $(($1<0?-$1:$1))
}
rendreEntier() {
local n=$1 sep=${n//[0-9]/}
test -z "${sep:=,}" && n="$n,0"
case $sep in
.) LC_NUMERIC=C printf -v n '%0.3f' $n;;
,) printf -v n '%0.3f' $n;;
esac
echo ${n//$sep}
}
evalMoyN() {
echo $(( $(abs $(($1-$2))) < $(abs $(($3-$2))) ))
}
#calcul des totaux
declare -ai nb groups
while read gr vl fr
do
[[ $gr != '#'* && $gr != '' ]] && {
vl=${vl//,/.}
nb[$gr]+=1
groups[$gr]+=$(rendreEntier $vl)
}
done <"$fGroups"
#calcul des moyennes
for gr in ${!groups[@]}
do
moyN[$gr]=$(( ${groups[gr]}/${nb[gr]} ))
done
#calcul de la valeur la plus proche de la moyenne
while read gr vl fr
do
[[ $gr != '#'* && $gr != '' ]] && {
vl=${vl//,/.}
(( $(evalMoyN $(rendreEntier $vl) ${moyN[gr]} $(rendreEntier ${k[gr]:-0})) )) && {
k[$gr]="$vl"
K[$gr]="$gr $vl(/${moyN[gr]:: -3},${moyN[gr]: -3}) $fr"
}
}
done <"$fGroups"
#affichage des résultats
printf '%s\n' "${K[@]}" |