Additionner des nombres de différentes tailles en bash

Bonjour,
Je voudrais additionner des nombre directement sous leur forme fournie.
Par exemple j’ai les nombres suivants:

101
10
152689
2.1m
1g

Et je dois obtenir la somme 1 002 252 800 sans avoir à convertir les m(mega) et g(giga) au préalable.

je cherche des calculatrice en ligne de comman de pour ça, mais je n’ai aps trouvé pour le moment (sauf concalc qui comprend 2.1m en 0.0021 ce qui est bon, mais je n’ai pas les autres constantes)

salut
ya bc mais pour les unités je ne vois pas

Oui c’est aussi ce que j’avais trouvé, j’ai essayé plusieurs autres calculatrices, mais sans résultat.
je pense que je vais tout simplement parser la liste et faire les conversion au fur et à mesure (en prenant la règle du 1k = 1024)

Tu peux peut-être essayer avec numfmt (du paquet coreutils), avec l’option --from=auto pour qu’il détecte automatiquement le format des nombres en entrée. Par contre il faut que les suffixes soient en majuscules:

$ numfmt --from=auto 7m
numfmt: suffixe incorrect en entrée : « 7m »

$ numfmt --from=auto 7mi
numfmt: suffixe incorrect en entrée : « 7mi »

$ numfmt --from=auto 7M
7000000

$ numfmt --from=auto 7Mi
7340032
1 J'aime

Ah, et numfmt n’accepte pas les caractères . pour séparer les décimales, il faut les remplacer par ,

Tu peux obtenir ce que tu veux avec quelque chose comme ça:

$ cat test.txt 
101
10
152689
2.1m
1g

$ somme=0 ; while read i ; do i=${i/./,} ; somme=$(echo "$somme + $(numfmt --from=auto ${i^^})" | bc) ; done < test.txt ; echo $somme
1002252800
1 J'aime

salut
numfmt accepte le point, mais il ne faut pas rester en français, par exemple, en rajoutant LC_ALL=C

$ cat test.txt 
101
10
152689
2.1m
1g

$ somme=0 ; while read i ; do somme=$(echo "$somme + $(LC_ALL=C numfmt --from=auto ${i^^})" | bc) ; done < test.txt ; echo $somme
1002252800
1 J'aime

j’ai oublié qu’il y a un espace avant la lettre m, mais je pense que ça devrait être facile à gérer

Bonjour,
on peut remplasser les saut de lignes par + avec tr, et remplacer m par *1000 … avant de calculer avec bc :

( cat test.txt | tr « \n » + | sed -e « s/m/*1000000/g » | sed -e « s/g/*1000000000/g » ;echo 0 ) | bc

1002252800.0

2 J'aime