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
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   
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
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; }' "$@"
la commande suivante va ajouter toutes les lignes (premier champ de la sortie awk)
awk '{s+=} END {print s}' filename
[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
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
while read -r num; do ((sum += num)); done < inputfile; echo $sum
  utilisez une boucle  for  pour itérer votre fichier ...  
sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum
si vous avez ruby installé""
cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"
[root@pentest3r ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)