Commande Bash pour faire la somme d'une colonne de nombres [dupliquer]

cette question a déjà une réponse ici:

  • commande Shell pour additionner des entiers, un par ligne? 41 réponses

je veux une commande de bash que je peux insérer dans la somme d'une colonne de nombres. Je veux juste une doublure rapide qui fera quelque chose comme ça.:

cat FileWithColumnOfNumbers.txt | sum
281
demandé sur Jonathan Leffler 2010-06-22 22:58:59

10 réponses

utilisant le fichier existant:

paste -sd+ infile | bc

utilisant stdin:

<cmd> | paste -sd+ | bc

Edit: Avec quelques coller implémentations vous devez être plus explicite lors de la lecture de stdin :

<cmd> | paste -sd+ - | bc

638
répondu Dimitre Radoulov 2012-11-09 18:14:21

j'aime la réponse choisie. Cependant, il tend à être plus lent que awk car il faut deux outils pour faire le travail.

$ wc -l file
49999998 file

$ time paste -sd+ file | bc
1448700364

real    1m36.960s
user    1m24.515s
sys     0m1.772s

$ time awk '{s+=}END{print s}' file
1448700364

real    0m45.476s
user    0m40.756s
sys     0m0.287s
140
répondu ghostdog74 2010-06-23 00:15:12

est-ce que deux lignes comptent?

awk '{ sum += ; }
     END { print sum; }' "$@"

, Vous pouvez alors l'utiliser sans le superflu 'cat':

sum < FileWithColumnOfNumbers.txt
sum   FileWithColumnOfNumbers.txt

FWIW: sur mac os X, vous pouvez le faire avec un one-liner:

awk '{ sum += ; } END { print sum; }' "$@"
40
répondu Jonathan Leffler 2010-06-22 19:02:10

la commande suivante va ajouter toutes les lignes (premier champ de la sortie awk)

awk '{s+=} END {print s}' filename
29
répondu minhas23 2017-02-18 05:21:44

[d'un suivi à ghostdog74s commentaires]

bash-2.03$ uname -sr
SunOS 5.8

bash-2.03$ perl -le 'print for 1..49999998' > infile

bash-2.03$ wc -l infile
 49999998 infile

bash-2.03$  time paste -sd+ infile | bc
bundling space exceeded on line 1, teletype
Broken Pipe

real    0m0.062s
user    0m0.010s
sys     0m0.010s

bash-2.03$ time nawk '{s+=}END{print s}' infile
1249999925000001

real    2m0.042s
user    1m59.220s
sys     0m0.590s
bash-2.03$ time /usr/xpg4/bin/awk '{s+=}END{print s}' infile
1249999925000001

real    2m27.260s
user    2m26.230s
sys     0m0.660s

bash-2.03$ time perl -nle'
  $s += $_; END { print $s }
   ' infile
1.249999925e+15

real    1m34.663s
user    1m33.710s
sys     0m0.650s
15
répondu Dimitre Radoulov 2010-06-23 08:20:45

vous pouvez utiliser bc (calculatrice). En supposant que votre fichier avec #s s'appelle "n":

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

le tr change toutes les nouvelles lignes en"+"; puis nous ajoutons 0 après le dernier plus, puis nous pipons l'expression ( 1+2+3+0 ) à la calculatrice

Ou, si vous êtes OK avec l'aide de awk ou perl, voici un Perl one-liner:

$perl -nle '$sum += $_ } END { print $sum' n
6
10
répondu DVK 2010-06-22 19:10:47
while read -r num; do ((sum += num)); done < inputfile; echo $sum
6
répondu Dennis Williamson 2010-06-22 19:56:09

utilisez une boucle for pour itérer votre fichier ...

sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum
4
répondu t6d 2010-06-22 20:20:28

si vous avez ruby installé""

cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"
4
répondu Joe Cannatti 2014-04-10 14:53:52
[root@pentest3r ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)
-4
répondu paco 2014-04-20 05:12:44