OVH Cloud OVH Cloud

expr: non-numeric argument

7 réponses
Avatar
Gérard Aubry
awk '$NF == "bytes.\r" && $(NF-2) == "size"{total+=$(NF-1)} END {print
total}' Clean >tail
Le résultat est
2.41217e+10
Mais je ne peut pas le diviser
La commande expr me dit : expr: non-numeric argument
Comment réussir à faire la division ?

Merci
aubryg@hager.fr

7 réponses

Avatar
Stephane Chazelas
2003/11/20, 15:47(+01), Gérard Aubry:
awk '$NF == "bytes.r" && $(NF-2) == "size"{total+=$(NF-1)} END {print
total}' Clean >tail
Le résultat est
2.41217e+10
Mais je ne peut pas le diviser


Tu peux faire la division dans awk.
Sinon, dans awk, tu peux forcer l'affichage sous forme d'entier
en faisant printf "%.17gn", total au lieu de print total (une
précision de 17 correspond à peu près au max qu'on peut obtenir
avec un double de 64 bits, ce qu'utilisent les awk en principe
pour leurs nombres, mais bon 17 chiffres ça commence à faire pas
mal).

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Gérard Aubry
2003/11/20, 15:47(+01), Gérard Aubry:
awk '$NF == "bytes.r" && $(NF-2) == "size"{total+=$(NF-1)} END {print
total}' Clean >tail
Le résultat est
2.41217e+10
Mais je ne peut pas le diviser


Tu peux faire la division dans awk.
Sinon, dans awk, tu peux forcer l'affichage sous forme d'entier
en faisant printf "%.17gn", total au lieu de print total



La division fonctionne :
expr 24121650842 / 1024
-1609524
mais le résultat est faux ??


Merci



Avatar
Laurent Wacrenier
Gérard Aubry écrit:
La division fonctionne :
expr 24121650842 / 1024
-1609524
mais le résultat est faux ??


Dans l'arthmétique modulo 2^32, il est juste.

Avatar
Gérard Aubry
Gérard Aubry écrit:
La division fonctionne :
expr 24121650842 / 1024
-1609524
mais le résultat est faux ??


Dans l'arthmétique modulo 2^32, il est juste.



24 121 265 842 est supérieur à 2^32.





Avatar
Stephane Chazelas
2003/11/20, 17:00(+01), Gérard Aubry:
[...]
La division fonctionne :
expr 24121650842 / 1024
-1609524
mais le résultat est faux ??
[...]


Oui, nombre trop grand pour expr. Vu que tu utilisais awk,
pourquoi ne pas l'utiliser jusqu'au bout:

printf "%.17gn", int(total / 1024)
(ou encore, GNU awk specific:
printf "%.17gn", rshift(total, 10)
)

Sinon, tu peux utiliser bc:

echo 24121650842 / 1024 | bc

qui n'a pas de limite de taille de nombre.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Laurent Wacrenier
Gérard Aubry écrit:
La division fonctionne :
expr 24121650842 / 1024
-1609524
mais le résultat est faux ??


Dans l'arthmétique modulo 2^32, il est juste.



24 121 265 842 est supérieur à 2^32.


L'arthmétique modulo 2^32 n'a pas de relation d'ordre.

24121650842 == 2646814362 == -1648152934




Avatar
ts
"L" == Laurent Wacrenier <lwa@ teaser . fr> writes:






L> L'arthmétique modulo 2^32 n'a pas de relation d'ordre.

Cela ira plus vite si vous dites qu'ils font un brutal "typecast" sur un
int dans le source de expr :-))


--

Guy Decoux