Команда Bash для подведения итогов столбца чисел [дубликат]

352
задан Jonathan Leffler 16 March 2015 в 05:56
поделиться

7 ответов

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

paste -sd+ infile | bc

Использование стандартного ввода:

<cmd> | paste -sd+ | bc

Изменить: С некоторыми реализациями paste вам нужно быть более явным при чтении из stdin :

| паста -sd + - | bc

778
ответ дан 23 November 2019 в 00:24
поделиться

Мне нравится выбранный ответ. Однако он, как правило, медленнее, чем 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
171
ответ дан 23 November 2019 в 00:24
поделиться

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

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

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

sum < FileWithColumnOfNumbers.txt
sum   FileWithColumnOfNumbers.txt

FWIW: в MacOS X вы можете сделать это с однострочным текстом:

awk '{ sum += $1; } END { print sum; }' "$@"
49
ответ дан 23 November 2019 в 00:24
поделиться

[продолжение комментариев 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
17
ответ дан 23 November 2019 в 00:24
поделиться
while read -r num; do ((sum += num)); done < inputfile; echo $sum
9
ответ дан 23 November 2019 в 00:24
поделиться

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

sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum
5
ответ дан 23 November 2019 в 00:24
поделиться

Вы можете использовать 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
11
ответ дан 23 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: