#1 Le 27/10/2019, à 10:59
- Rugix
(Résolu) Calcul avec des nombres flottants
Bonjour,
Je débutant sur Bash, mon objectif est de Ping un site et d'envoyer les valeurs dans un fichier texte les valeurs s'affichent ainsi
2
4
5
3
Afin d'obtenir la moyenne et les valeurs extrêmes je fais cela
sum=0
nb_line=0
vmin=999999999 # Valeur supérieure à toutes celles du fichier
vmax=0 # Valeur inférieure à toutes celles du fichier
while read val
do
((sum+=val))
((nb_line++))
[[ val -lt vmin ]] && vmin=$val
[[ val -gt vmax ]] && vmax=$val
done < fichier
moy=$(bc <<<"scale=2;$sum/$nb_line")
echo moy=$moy vmin=$vmin vmax=$vmax
Mais les valeurs de pings s'affichent avec des points, je voudrais donc remplacer les point présents dans le ficher qui se nomme Ping_rec par des virgules.
Merci d'avance
Dernière modification par Rugix (Le 27/10/2019, à 21:32)
Hors ligne
#2 Le 27/10/2019, à 11:05
- Sciensous
Re : (Résolu) Calcul avec des nombres flottants
pense à utiliser les balises
pour remplacer les points, il ya sed tr ... mais je pense qu'il faut passer par un intermédiaire:
exemple
T="moy=$moy vmin=$vmin vmax=$vmax"
echo "$T" | tr '.' ','
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#3 Le 27/10/2019, à 11:35
- Rugix
Re : (Résolu) Calcul avec des nombres flottants
Bonjour,
Merci pour votre aide, mais j'ai toujours la même erreur qui est :
Erreur de syntaxe : opérateur arithmétique non valable le symbole erronée est : . 5
Car dans le fichiers texte les pings sont affichés avec des points.
Hors ligne
#4 Le 27/10/2019, à 11:52
- pingouinux
Re : (Résolu) Calcul avec des nombres flottants
Bonjour,
Les opérateurs -lt et -gt ne travaillent que sur des entiers.
arg1 OP arg2
OP is one of -eq, -ne, -lt, -le, -gt, or -ge. These arithmetic binary operators return true
if arg1 is equal to, not equal to, less than, less than or equal to, greater than, or greater
than or equal to arg2, respectively. Arg1 and arg2 may be positive or negative integers.
Donne un exemple de fichier.
Hors ligne
#5 Le 27/10/2019, à 12:32
- Rugix
Re : (Résolu) Calcul avec des nombres flottants
Bonjour,
Je vous montre tout:
Le ping je le fais comme ça:
# Faire un Ping
temps=$(ping -c 1 ac-nantes.fr | grep rtt | awk -F "/" '{print $5}')
Ping1=$temps
# Envoi des pings vers le ficher texte correspondant
echo $Ping1 >> Ping
echo "Le temps du ping est de $Ping1 ms."
puis j'obtiens donc un fichier texte:
41.262
34.569
39.245
33.806
34.052
34.291
34.800
36.166
Et pour obtenir la valeur moyenne et les valeurs extrêmes:
sum=0
nb_line=0
vmin=999999
vmax=0
while read val
do
echo $val
((sum+=val))
((nb_line++))
[[ val -lt vmin ]] && vmin=$val
[[ val -gt vmax ]] && vmax=$val
done < Ping_rec
moy=$(bc <<<"scale=2;$sum/$nb_line")
echo moy=$moy vmin=$vmin vmax=$vmax
Dernière modification par Rugix (Le 27/10/2019, à 14:28)
Hors ligne
#6 Le 27/10/2019, à 12:49
- pingouinux
Re : (Résolu) Calcul avec des nombres flottants
En adaptant le script :
sum=0
nb_line=0
vmin=999999999 # Valeur supérieure à toutes celles du fichier
vmax=0 # Valeur inférieure à toutes celles du fichier
while read val
do
sum=$(bc <<<"$sum+$val")
((nb_line++))
[[ $(bc <<<"$val<$vmin") -eq 1 ]] && vmin=$val
[[ $(bc <<<"$val>$vmax") -eq 1 ]] && vmax=$val
done < fichier
moy=$(bc -l <<<"$sum/$nb_line")
echo moy=$moy vmin=$vmin vmax=$vmax
Résultat avec tes valeurs :
moy=36.02387500000000000000 vmin=33.806 vmax=41.262
Ajouté : Avec awk
awk -v vmin=999999999 -v vmax=0 '{s+=$1;if($1<vmin)vmin=$1;if($1>vmax)vmax=$1}END{printf("moy=%s vmin=%s vmax=%s\n",s/NR,vmin,vmax)}' fichier
Dernière modification par pingouinux (Le 27/10/2019, à 12:55)
Hors ligne
#8 Le 27/10/2019, à 13:15
- Rugix
Re : (Résolu) Calcul avec des nombres flottants
Rebonjour,
Merci pour votre aide cela marche très bien.
Désolé pour les balises je ne savais pas comment les faire.
Hors ligne
#9 Le 27/10/2019, à 13:36
- cqfd93
Re : (Résolu) Calcul avec des nombres flottants
Désolé pour les balises je ne savais pas comment les faire.
Maintenant que tu as la marche à suivre, il reste à le faire…
− cqfd93 −
Hors ligne
#10 Le 27/10/2019, à 16:46
- Rugix
Re : (Résolu) Calcul avec des nombres flottants
Bonsoir,
Pouvez-vous m'expliquer la partie du milieu du code avec l'utilisation de bc je ne comprend pas trop.
Dernière modification par Rugix (Le 27/10/2019, à 16:56)
Hors ligne
#11 Le 27/10/2019, à 17:01
- pingouinux
Re : (Résolu) Calcul avec des nombres flottants
Pouvez-vous m'expliquer la partie du milieu du code avec l'utilisation de br je ne comprend pas trop.
Où vois-tu br ?
S'il s'agit de bc, il calcule l'expression entre " ". Si c'est une expression logique, il retourne 1 si elle est vraie.
Hors ligne
#12 Le 27/10/2019, à 17:20
- Rugix
Re : (Résolu) Calcul avec des nombres flottants
Merci pour votre réponse.
Oui faute de frappe je voulais dire bc.
Bonne soirée
Hors ligne
#13 Le 27/10/2019, à 17:30
- pingouinux
Re : (Résolu) Calcul avec des nombres flottants
Tu devrais donner à la discussion un titre plus explicite.
Hors ligne
#14 Le 27/10/2019, à 21:07
- pingouinux
Re : (Résolu) Calcul avec des nombres flottants
(Résolu) Remplacement des point par des virgules
J'aurais plutôt mis : [Résolu] Calcul avec des nombres flottants
Tu as aussi une solution en python :
python3 -c "with open('fichier') as f: v=list(map(float,f.read().split())); print('moy=%s vmin=%s vmax=%s\n'%(sum(v)/len(v),min(v),max(v)))"
Hors ligne