2010-05-24 5 views
2

Comment puis-je additionner (en utilisant un shell Linux) des nombres dans une colonne? Si possible, je ne veux pas utiliser d'outils puissants comme awk ou perl. Je veux quelque chose comme giveMeNumber | sumColonnes de somme de shell Linux

+0

« Comment puis-je obtenir un clou dans un morceau de bois? Je ne veux pas utiliser un marteau. " Pourquoi diable voudriez-vous éviter les outils qui sont parfaits pour le travail? –

+0

Possible dupe: http://stackoverflow.com/questions/2702564/how-can-i-quickly-sum-all-numbers-in-a-file/2702614#2702614 –

+0

@William: Ne tuez pas une puce avec un marteau-piqueur – yassin

Répondre

4

Puisque vous n'avez pas fourni l'échantillon de fichier, je vais montrer l'approche simple (1ère colonne), en utilisant la calculatrice de Unix bc et transformer les nouvelles lignes en « + » en utilisant la commande tr - vous avez besoin d'un 0 supplémentaire à la fin depuis le saut de ligne après le dernier numéro créera un supplément « + » à la fin:

$ cat a 
1 
2 
3 
$ cat a | tr "\012" "+" ; echo "0" 
1+2+3+0 
$ (cat a | tr "\012" "+" ; echo "0") |bc 
6 

Cependant, je ne suis pas tout à fait sûr pourquoi vous devez éviter Perl, car il est très facile à faire en une ligne:

> perl5.8 -ae '{map {$sum+=$_} <>; print "$sum\n"}' a 
6 
+1

http://www.pixelbeat.org/scripts/add – pixelbeat

1

bien - si vous utilisez bash (ce qui est probablement le shell le plus couramment utilisé sur Linux, mais il n'y a pas vraiment un « shell Linux » :-) vous pouvez faire quelque chose comme ce qui suit:

#!/bin/bash 
a=0 
while read n; do 
    a=$[a+n] 
done 
echo $a 

Ce serait votre programme sum - bien que ce soit probablement une bonne idée de l'appeler autrement puisque sum est un utilitaire standard pour calculer les sommes de contrôle.

+1

La méthode que vous montrez fonctionnera dans les shells POSIX en plus de Bash. La construction '$ [...]' est obsolète, utilisez '$ ((...))' à la place. Ou, dans Bash, faites '((a + = n))'. –

2

Pourquoi voulez-vous éviter awk? Il est assez simple à faire, et vous pouvez facilement changer la colonne à somme en changeant $1 à $2, $3, etc.

$ seq 10 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
$ seq 10 | awk '{sum += $1} END{print sum}' 
55 
3
giveMeNumber | (tr '\n' '+'; echo 0) | bc 

En supposant que giveMeNumber génère un numéro par ligne dans la première colonne, utilisez cut extraire la colonne appropriée autrement. La commande tr remplacera jamais le caractère de nouvelle ligne avec un signe plus:

1 
2 
3 

devient

1 + 2 + 3 +

le echo 0 à la fin est nécessaire pour éviter une analyse syntaxique erreur du final + à la fin. Tout cela est alimenté à bc qui voit une expression arithmétique qui résume bien les chiffres et imprime le résultat:

$ seq 10|(tr '\n' '+'; echo 0)|bc 
55 
0

Vous pouvez le faire avec Alacon - utilitaire de ligne de commande pour la base de données Alasql. Il fonctionne avec Node.js, vous devez installer Node.js puis Alasql package:

Pour calculer la somme de StdIn vous pouvez utiliser la commande suivante:

> cat data.txt | node alacon "SELECT VALUE SUM([0]) FROM TXT()" 
Questions connexes