[shell] additions

Le
Frédéric Boiteux
Bonjour,

Je cherche le moyen simple dans une commande shell (bash)
d'additionner des nombres lus sur l'entrée standard, par exemple la
sortie de la commande ls -l | awk '{print $5}'. Auriez-vous une idée ?

Fred.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers debian-user-french-REQUEST@lists.debian.org
En cas de soucis, contactez EN ANGLAIS listmaster@lists.debian.org
Archive: http://lists.debian.org/20101203160523.2e6cbc21@prem6s
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sylvain L. Sauvage
Le #22877991
Le vendredi 3 décembre 2010 à 16:05:23, Frédéric Boiteu x a écrit
:
Bonjour,



’jour,

Je cherche le moyen simple dans une commande shell (bash)
d'additionner des nombres lus sur l'entrée standard, par
exemple la sortie de la commande ls -l | awk '{print $5}'.
Auriez-vous une idée ?



awk 'BEGIN {s = 0} {s += $5} END {print s}'

--
Sylvain Sauvage

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Frédéric Boiteux
Le #22878001
Le Fri, 3 Dec 2010 16:23:37 +0100,
"Sylvain L. Sauvage"
awk 'BEGIN {s = 0} {s += $5} END {print s}'



Ah, oui, mais awk, c'est de la triche ;-P

Merci,
Fred.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Sylvain L. Sauvage
Le #22878101
Le vendredi 3 décembre 2010 à 16:29:06, Frédéric Boiteu x a écrit
:
> awk 'BEGIN {s = 0} {s += $5} END {print s}'

Ah, oui, mais awk, c'est de la triche ;-P



Tu l’utilisais déjà dans ton exemple :oP

Sinon, tu as
… | { s=0; while read i; s=$[ $s + $i ]; done; echo $s; }

Mais $[] ne connaît que les entiers.

Franchement, regrouper tous les 'grep | cut | awk' dans un
seul 'awk' (ou perl, ruby…) me paraît souvent plus propre et
plus clair (euh, ok, pas forcément avec perl…). Quand un outil
est dépassé, autant le remplacer que d’enfiler les tubes (et
donc les processus) avec des commandes sous-utilisées.

--
Sylvain Sauvage

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Yves Rutschle
Le #22878111
On Fri, Dec 03, 2010 at 04:29:06PM +0100, Frédéric Boiteux wrote:
Le Fri, 3 Dec 2010 16:23:37 +0100,
"Sylvain L. Sauvage"
> awk 'BEGIN {s = 0} {s += $5} END {print s}'

Ah, oui, mais awk, c'est de la triche ;-P



Et Perl?

ls -l | awk '{print $5}' | perl -nle '$c += $_; END{print $c;}'

Ton cahier des charges n'est pas complet, qu'est-ce qui
n'est pas de la triche?

On peut faire ça aussi:
ls -l | awk '{print $5}' | while read n; do c=$(( c + n )); echo $c; done | tail -n 1

(on devrait pouvoir faire mieux, en imprimant $c après la
boucle et sans le tail, mais je n'arrive pas à "sortir" $c
de la boucle, et je comprend pas pourquoi pour le moment).


Y.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Sylvain L. Sauvage
Le #22878181
Le vendredi 3 décembre 2010 à 16:45:46, Yves Rutschle a écri t :
On Fri, Dec 03, 2010 at 04:29:06PM +0100, Frédéric Boiteux


wrote:
[…]
On peut faire ça aussi:
ls -l | awk '{print $5}' | while read n; do c=$(( c + n ));
echo $c; done | tail -n 1

(on devrait pouvoir faire mieux, en imprimant $c après la
boucle et sans le tail, mais je n'arrive pas à "sortir" $c
de la boucle, et je comprend pas pourquoi pour le moment).



Parce que ton c n’est pas connu en dehors de la boucle.
D’où, en plus de bien initialiser c, mon
c=0; <boucle>; echo $c;
et l’enrobage dans une liste { … }.

--
Sylvain Sauvage

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Jean-Yves F. Barbier
Le #22878171
On Fri, 3 Dec 2010 16:05:23 +0100, Frédéric Boiteux wrote:

Je cherche le moyen simple dans une commande shell (bash)
d'additionner des nombres lus sur l'entrée standard, par exemple la
sortie de la commande ls -l | awk '{print $5}'. Auriez-vous une idée ?



pour ce cas particulier: du -s /mondirquejeveuxsataillealui

--

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Yves Rutschle
Le #22878261
On Fri, Dec 03, 2010 at 05:17:40PM +0100, Sylvain L. Sauvage wrote:
Parce que ton c n'est pas connu en dehors de la boucle.
D'où, en plus de bien initialiser c, mon
c=0; <boucle>; echo $c;
et l'enrobage dans une liste { ... }.



Je me doutais d'un truc de ce genre là, j'avais bein essayer
de "déclarer" c avec "variable c" mais je pense que je
confond avec javascript. Comme quoi, ne pas pratiquer un
language régulièrement, ça rouille.

Merci!
Y.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Erwan David
Le #22878311
On Fri, Dec 03, 2010 at 04:05:23PM CET, Frédéric Boiteux
Bonjour,

Je cherche le moyen simple dans une commande shell (bash)
d'additionner des nombres lus sur l'entrée standard, par exemple la
sortie de la commande ls -l | awk '{print $5}'. Auriez-vous une idée ?

Fred.



result = 0
while read next;do
result=$(( $result + $next ))
done

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Sylvain L. Sauvage
Le #22878341
Le vendredi 3 décembre 2010 à 17:20:42, Yves Rutschle a écri t :
On Fri, Dec 03, 2010 at 05:17:40PM +0100, Sylvain L. Sauvage


wrote:
> Parce que ton c n'est pas connu en dehors de la boucle.
> D'où, en plus de bien initialiser c, mon
>
> c=0; <boucle>; echo $c;
>
> et l'enrobage dans une liste { ... }.

Je me doutais d'un truc de ce genre là, j'avais bein essayer
de "déclarer" c avec "variable c" mais je pense que je
confond avec javascript. Comme quoi, ne pas pratiquer un
language régulièrement, ça rouille.



Plutôt declare ou local (dans une fonction pour ce dernier)

Merci!



Heu, en fait, m’avions gouru : l’initialisation ne sert pas ,
c’est la liste qui fait tout (terme du man : « commandes
groupées »). M’enfin initialiser, ça fait pas de ma l…

Les accolades ont donc l’avantage, en plus de ne pas créer de
sous-processus, d’encapsuler les variables locales.

Au passage, tu as raison d’utiliser $(( )), dash ne connaît pa s
$[].

--
Sylvain Sauvage

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Frédéric Boiteux
Le #22890091
Le Fri, 3 Dec 2010 17:07:45 +0100,
"Sylvain L. Sauvage"
Le vendredi 3 décembre 2010 à 16:29:06, Frédéric Boit eux a écrit
:
> > awk 'BEGIN {s = 0} {s += $5} END {print s}'
>
> Ah, oui, mais awk, c'est de la triche ;-P

Tu l’utilisais déjà dans ton exemple :oP

Sinon, tu as
… | { s=0; while read i; s=$[ $s + $i ]; done; echo $s; }

Mais $[] ne connaît que les entiers.

Franchement, regrouper tous les 'grep | cut | awk' dans un
seul 'awk' (ou perl, ruby…) me paraît souvent plus propre et
plus clair (euh, ok, pas forcément avec perl…). Quand un out il
est dépassé, autant le remplacer que d’enfiler les tube s (et
donc les processus) avec des commandes sous-utilisées.




Merci à tous pour vos réponses.

J'avais pour ma part cherché du coté de « bc  » ou autres outils
mathématiques, sans trop penser à awk ou perl… Mon exempl e n'est sans
doute pas le mieux trouvé car on peut effectivement calculer l'info par
ailleurs, mais ce n'était pas la première fois que je tombais sur le
cas d'une liste de nombres à additionner depuis un pipe shell, et je
pensais vraiment qu'il devait y avoir un petit outil Unix pour cela.

Bonne semaine,
Fred.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Publicité
Poster une réponse
Anonyme