# Additionner des nombres de différentes tailles en bash

**URL:** <https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438>\
**Category:** Support Debian\
**Created:** [Janvier 16, 2024, 11:36 UTC](https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438 "2024-01-16T11:36:32Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Janvier 16, 2024, 11:36 UTC](https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438/1 "2024-01-16T11:36:33Z")

</div>

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

```auto
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)

---

<div class="post-metadata">

**Author:** ![dindoun](https://www.debian-fr.org/user_avatar/www.debian-fr.org/dindoun/32/4281_2.png) [@dindoun](https://www.debian-fr.org/u/dindoun)\
**Post date:** [Janvier 17, 2024, 2:35 UTC](https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438/2 "2024-01-17T02:35:00Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Janvier 17, 2024, 12:51 UTC](https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438/3 "2024-01-17T12:51:29Z")

</div>

> [@dindoun](#):
>
> 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)

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Janvier 17, 2024, 2:56 UTC](https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438/4 "2024-01-17T14:56:26Z")

</div>

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:

```auto
$ 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

```

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Janvier 17, 2024, 3:12 UTC](https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438/5 "2024-01-17T15:12:38Z")

</div>

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:

```auto
$ 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

```

---

<div class="post-metadata">

**Author:** ![dindoun](https://www.debian-fr.org/user_avatar/www.debian-fr.org/dindoun/32/4281_2.png) [@dindoun](https://www.debian-fr.org/u/dindoun)\
**Post date:** [Janvier 17, 2024, 7:36 UTC](https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438/6 "2024-01-17T19:36:17Z")

</div>

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

```auto
$ 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

```

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Janvier 18, 2024, 9:21 UTC](https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438/7 "2024-01-18T09:21:52Z")

</div>

> [@dindoun](#):
>
> `2.1m`

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

---

<div class="post-metadata">

**Author:** ![kos104](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/9de053/32.png) [@kos104](https://www.debian-fr.org/u/kos104)\
**Post date:** [Janvier 21, 2024, 8:35 UTC](https://www.debian-fr.org/t/additionner-des-nombres-de-differentes-tailles-en-bash/89438/8 "2024-01-21T20:35:45Z")

</div>

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 «&nbsp;\n&nbsp;» + | sed -e «&nbsp;s/m/\*1000000/g&nbsp;» | sed -e «&nbsp;s/g/\*1000000000/g&nbsp;» ;echo 0 ) | bc

1002252800.0
