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";)