separador - Comando Bash para sumar una columna de números
awk separador de campos (10)
Utilizando archivo existente:
paste -sd+ infile | bc
Utilizando stdin:
<cmd> | paste -sd+ | bc
Edición: con algunas implementaciones de pegado , debes ser más explícito al leer desde la entrada estándar :
<cmd> | paste -sd+ - | bc
Esta pregunta ya tiene una respuesta aquí:
- ¿Comando de shell para sumar enteros, uno por línea? 41 respuestas
Quiero un comando de bash que pueda canalizar que sumará una columna de números. Solo quiero un forro rápido que hará algo esencialmente como esto:
cat FileWithColumnOfNumbers.txt | sum
¿Cuentan dos líneas?
awk ''{ sum += $1; }
END { print sum; }'' "$@"
Puedes usarlo sin el ''gato'' superfluo:
sum < FileWithColumnOfNumbers.txt
sum FileWithColumnOfNumbers.txt
FWIW: en MacOS X, puedes hacerlo con una sola línea:
awk ''{ sum += $1; } END { print sum; }'' "$@"
El siguiente comando agregará todas las líneas (primer campo de la salida de awk)
awk ''{s+=$1} END {print s}'' filename
Me gusta la respuesta elegida. Sin embargo, tiende a ser más lento que awk ya que se necesitan 2 herramientas para hacer el trabajo.
$ wc -l file
49999998 file
$ time paste -sd+ file | bc
1448700364
real 1m36.960s
user 1m24.515s
sys 0m1.772s
$ time awk ''{s+=$1}END{print s}'' file
1448700364
real 0m45.476s
user 0m40.756s
sys 0m0.287s
Puedes usar bc (calculadora). Asumiendo que su archivo con #s se llama "n":
$ cat n
1
2
3
$ (cat n | tr "/012" "+" ; echo "0") | bc
6
El tr
cambia todas las nuevas líneas a "+"; luego agregamos 0 después de la última suma, luego canalizamos la expresión ( 1+2+3+0
) a la calculadora
O, si estás de acuerdo con el uso de awk o perl, aquí tienes una frase de Perl:
$perl -nle ''$sum += $_ } END { print $sum'' n
6
Si tienes ruby instalado
cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"
Use un bucle for
para iterar sobre su archivo ...
sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum
[un seguimiento a los comentarios de ghostdog74s]
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+=$1}END{print s}'' infile
1249999925000001
real 2m0.042s
user 1m59.220s
sys 0m0.590s
bash-2.03$ time /usr/xpg4/bin/awk ''{s+=$1}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
[root@pentest3r ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)
while read -r num; do ((sum += num)); done < inputfile; echo $sum