Команда Bash для суммирования столбца чисел

bash

236116 просмотра

10 ответа

Я хочу команду bash, в которую я могу передать, которая будет суммировать столбец чисел. Я просто хочу быстрый лайнер, который будет делать что-то вроде этого:

cat FileWithColumnOfNumbers.txt | sum
Автор: Jubal Источник Размещён: 12.11.2019 09:23

Ответы (10)


773 плюса

Решение

Используя существующий файл:

paste -sd+ infile | bc

Использование stdin:

<cmd> | paste -sd+ | bc

Изменить: С некоторыми реализациями вставки вы должны быть более явными при чтении из стандартного ввода :

<cmd> | paste -sd+ - | bc

Автор: Dimitre Radoulov Размещён: 22.06.2010 07:47

168 плюса

Мне нравится выбранный ответ. Тем не менее, он имеет тенденцию быть медленнее, чем awk, так как для этой работы необходимы 2 инструмента.

$ 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
Автор: ghostdog74 Размещён: 23.06.2010 12:08

48 плюса

Считаются ли две строки?

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

Затем вы можете использовать его без лишнего «кота»:

sum < FileWithColumnOfNumbers.txt
sum   FileWithColumnOfNumbers.txt

FWIW: на MacOS X вы можете сделать это с помощью одной строки:

awk '{ sum += $1; } END { print sum; }' "$@"
Автор: Jonathan Leffler Размещён: 22.06.2010 07:02

43 плюса

Следующая команда добавит все строки (первое поле вывода awk)

awk '{s+=$1} END {print s}' filename
Автор: minhas23 Размещён: 25.03.2014 09:26

16 плюса

[продолжение комментариев 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
Автор: Dimitre Radoulov Размещён: 23.06.2010 08:15

10 плюса

Вы можете использовать bc (калькулятор). Предполагая, что ваш файл с #s называется "n":

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

trИзменяет все пустые строки в «+»; затем мы добавляем 0 после последнего плюса, затем передаем выражение ( 1+2+3+0) в калькулятор

Или, если вы в порядке с использованием awk или perl, вот одна строка Perl:

$perl -nle '$sum += $_ } END { print $sum' n
6
Автор: DVK Размещён: 22.06.2010 07:04

8 плюса

while read -r num; do ((sum += num)); done < inputfile; echo $sum
Автор: Dennis Williamson Размещён: 22.06.2010 07:56

4 плюса

Используйте forцикл для перебора вашего файла ...

sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum
Автор: t6d Размещён: 22.06.2010 07:06

3 плюса

Если у вас установлен ruby

cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"
Автор: Joe Cannatti Размещён: 10.04.2014 02:53

-4 плюса

[root@pentest3r ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)
Автор: paco Размещён: 20.04.2014 04:49
Вопросы из категории :
32x32