sumar separador columnas campos bash

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í:

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