Команда оболочки для суммирования целых чисел, по одному на строку? - PullRequest
765 голосов
/ 16 января 2009

Я ищу команду, которая примет в качестве входных данных несколько строк текста, каждая строка содержит одно целое число, и выведет сумму этих целых чисел.

Для справки: у меня есть файл журнала, который включает измерения времени, поэтому с помощью поиска соответствующих строк и небольшого переформатирования sed я могу перечислить все значения времени в этом файле. Тем не менее, я хотел бы вычислить итоговое значение, и у меня не осталось мыслей относительно любой команды, к которой я могу направить этот промежуточный вывод, чтобы получить окончательную сумму. Я всегда использовал expr в прошлом, но если он не работает в режиме RPN, я не думаю, что он справится с этим (и даже тогда это будет сложно).

Чего мне не хватает? Учитывая, что, вероятно, есть несколько способов достичь этого, я буду рад прочитать (и поддержать) любой подход, который работает, даже если кто-то уже опубликовал другое решение, которое выполняет эту работу.

Схожий вопрос: Кратчайшая команда для вычисления суммы столбца вывода в Unix? (кредиты @ Андрей )


Обновление : Вау, как и ожидалось, здесь есть несколько хороших ответов. Похоже, мне определенно придется провести awk более глубокую проверку в качестве инструмента командной строки в целом!

Ответы [ 42 ]

6 голосов
/ 28 октября 2015

для любителей Ruby

ruby -e "puts ARGF.map(&:to_i).inject(&:+)" numbers.txt
4 голосов
/ 23 мая 2014

Моя версия:

seq -5 10 | xargs printf "- - %s" | xargs  | bc
3 голосов
/ 24 января 2013

C (не упрощенно)

seq 1 10 | tcc -run <(cat << EOF
#include <stdio.h>
int main(int argc, char** argv) {
    int sum = 0;
    int i = 0;
    while(scanf("%d", &i) == 1) {
        sum = sum + i;
    }
    printf("%d\n", sum);
    return 0;
}
EOF)
3 голосов
/ 04 ноября 2012

Однострочник в ракетке:

racket -e '(define (g) (define i (read)) (if (eof-object? i) empty (cons i (g)))) (foldr + 0 (g))' < numlist.txt
3 голосов
/ 16 января 2009

Должно работать следующее (при условии, что ваш номер - второе поле в каждой строке).

awk 'BEGIN {sum=0} \
 {sum=sum + $2} \
END {print "tot:", sum}' Yourinputfile.txt
3 голосов
/ 27 сентября 2017

Невозможно избежать отправки этого:

jot 1000000 | sed '2,$s/$/+/;$s/$/p/' | dc

Здесь можно найти:
Самый элегантный однострочник оболочки Unix для суммирования списка чисел произвольной точности?

А вот его особые преимущества перед awk, bc и friends:

  • он не зависит от буферизации и, следовательно, не задыхается при действительно больших входах
  • это не подразумевает никакой конкретной точности - или целочисленного размера для этого вопроса - ограничивает
  • нет необходимости в другом коде, если необходимо добавить числа с плавающей запятой
3 голосов
/ 16 января 2009

Вы можете сделать это в Python, если вам удобно:

Не тестировался, просто набрал:

out = open("filename").read();
lines = out.split('\n')
ints = map(int, lines)
s = sum(ints)
print s

Себастьян указал на один строчный скрипт:

cat filename | python -c"from fileinput import input; print sum(map(int, input()))"
2 голосов
/ 15 октября 2009
$ cat n
2
4
2
7
8
9
$ perl -MList::Util -le 'print List::Util::sum(<>)' < n
32

Или вы можете ввести цифры в командной строке:

$ perl -MList::Util -le 'print List::Util::sum(<>)'
1
3
5
^D
9

Тем не менее, этот файл хлюпает, поэтому не рекомендуется использовать его на больших файлах. См. ответ j_random_hacker , в котором не допускается бред.

2 голосов
/ 20 марта 2015

Вы можете использовать предпочитаемую команду 'expr', вам просто нужно сначала немного ввести ввод:

seq 10 | tr '[\n]' '+' | sed -e 's/+/ + /g' -e's/ + $/\n/' | xargs expr

Процесс:

  • "tr" заменяет символы eoln символом +,
  • sed дополняет '+' пробелами с каждой стороны, а затем убирает последний + со строки
  • xargs вставляет переданный по конвейеру ввод в командную строку для использования expr.
2 голосов
/ 12 октября 2011

C ++ (упрощенно):

echo {1..10} | scc 'WRL n+=$0; n'

Проект SCC - http://volnitsky.com/project/scc/

SCC - это анализатор фрагментов кода C ++ в командной строке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...