Я ищу команду, которая будет принимать (в качестве входных данных) несколько строк текста, каждая строка содержит одно целое число, и выводит сумму этих целых чисел.
В качестве предыстории у меня есть файл журнала, который включает измерения времени. Посредством поиска соответствующих строк и небольшого sed
переформатирования я могу перечислить все моменты времени в этом файле. Я хотел бы отработать итог. Я могу передать этот промежуточный вывод любой команде, чтобы получить окончательную сумму. Я всегда использовал expr
в прошлом, но если он не работает в режиме RPN, я не думаю, что он справится с этим (и даже тогда это будет сложно).
Как я могу получить сумму целых чисел?
Ответы:
Немного аук должно сделать это?
Примечание: некоторые версии awk имеют странное поведение, если вы собираетесь добавлять что-либо, превышающее 2 ^ 31 (2147483647). Смотрите комментарии для получения дополнительной информации. Одним из предложений является использование,
printf
а неprint
:источник
ls $@ | xargs -i pdftk {} dump_data | grep NumberOfPages | awk '{s+=$2} END {print s}'
awk '{s+=$1} END {printf "%.0f", s}' mydatafile
вместо этого.Вставка обычно объединяет строки из нескольких файлов, но ее также можно использовать для преобразования отдельных строк файла в одну строку. Флаг разделителя позволяет вам передавать уравнение типа x + x в bc.
Кроме того, когда трубопровод от стандартного ввода,
источник
paste
в-
качестве имени файла можно использовать тире - что позволит вам передавать числа из выходных данных команды в стандартный вывод вставки без необходимости сначала создавать файл:<commands> | paste -sd+ - | bc
-
, хотя. (Это полезно, если вы хотите объединить файл со стандартным вводом).Однострочная версия в Python:
источник
python -c"import sys; print(sum(map(int, sys.stdin)))"
find . -name '*.epub' -exec stat -c %s '{}' \; | python -c "import sys; nums = [int(n) for n in sys.stdin if int(n) < 10000000]; print(sum(nums)/len(nums))"
import sys; print(sum(int(''.join(c for c in l if c.isdigit())) for l in sys.stdin))
Я бы поставил большое ПРЕДУПРЕЖДЕНИЕ по общепринятому решению:
это потому, что в этой форме awk использует 32-разрядное целочисленное представление со знаком: оно будет переполнено для сумм, которые превышают 2147483647 (т. е. 2 ^ 31).
Более общий ответ (для суммирования целых чисел) будет:
источник
echo -e "2147483647 \n 100" |awk '{s+=$1}END{print s}'
показывает2147483747
echo 999999999999999999 | awk '{s+=$1} END {printf "%.0f\n", s}'
производит1000000000000000000
Обычный удар:
источник
num
определяется? Я считаю, что это как-то связано с< numbers.txt
выражением, но не понятно, как.Обратите внимание, что отрицательные числа с префиксом минус должны быть переведены для
dc
, так как он использует_
префикс, а не-
префикс для этого. Например, черезtr '-' '_' | dc -f- -e '...'
.Изменить: так как этот ответ получил так много голосов "за неизвестность", вот подробное объяснение:
Выражение
[+z1<r]srz1<rp
делает следующее :Как псевдокод:
Чтобы действительно понять простоту и мощь
dc
, вот рабочий скрипт Python, который реализует некоторые команды изdc
и выполняет версию Python вышеупомянутой команды:источник
(echo "0"; sed 's/$/ +/' inp; echo 'pq')|dc
.dc -e '0 0 [+?z1<m]dsmxp'
. Поэтому мы не сохраняем все числа в стеке перед обработкой, а читаем и обрабатываем их по одному (точнее, построчно, поскольку одна строка может содержать несколько чисел). Обратите внимание, что пустая строка может завершить последовательность ввода.sed
подстановке может быть удален, посколькуdc
не заботится о пробелах между аргументами и операторами.(echo "0"; sed 's/$/+/' inputFile; echo 'pq')|dc
С JQ :
источник
Чистый и короткий удар.
источник
f=$(<numbers.txt)
.f=$(cat); echo $(( ${f//$'\n'/+} ))
скрипт, то вы можете направить что- нибудь к этому скрипту или вызвать его без аргументов для интерактивного ввода в стандартный ввод (завершите с помощью Control-D).<numbers.txt
улучшение, но в целом это решение эффективно только для небольших входных файлов; например, с файлом из 1000 строк ввода принятоеawk
решение примерно в 20 раз быстрее на моем компьютере - и также потребляет меньше памяти, поскольку файл не читается сразу.источник
Мои пятнадцать центов:
Пример:
источник
grep -v '^$'
. Спасибо!Я сделал быстрый тест на существующие ответы, которые
lua
илиrocket
),Я всегда прибавлял числа от 1 до 100 миллионов, что было выполнимо на моей машине менее чем за минуту для нескольких решений.
Вот результаты:
питон
Awk
Вставить & Bc
Это исчерпало память на моей машине. Это работало для половины размера ввода (50 миллионов чисел):
Так что, я думаю, это заняло бы ~ 35 с на 100 миллионов номеров.
Perl
Рубин
С
Просто для сравнения я скомпилировал версию C и также протестировал ее, чтобы понять, насколько медленнее решения на основе инструментов.
Вывод
C, конечно, быстрее всего с 8 секундами , но решение Pypy только добавляет очень небольшие накладные расходы, примерно от 30% до 11 секунд . Но, честно говоря, Pypy не совсем стандарт. У большинства людей установлен только CPython, который значительно медленнее (22 с), точно так же быстро, как и популярное решение Awk.
Самым быстрым решением на основе стандартных инструментов является Perl (15 с).
источник
paste
+bc
Подход был только то , что я искал в сумму шестнадцатеричных значений, спасибо!use std::io::{self, BufRead}; fn main() { let stdin = io::stdin(); let mut sum: i64 = 0; for line in stdin.lock().lines() { sum += line.unwrap().parse::<i64>().unwrap(); } println!("{}", sum); }
Обычный удар одним вкладышем
источник
echo $(( $( tr "\n" "+" < /tmp/test) 0 ))
tr
не совсем "обычный удар" / придурокРешение BASH, если вы хотите сделать это командой (например, если вам нужно делать это часто):
Тогда использование:
источник
Я думаю, что AWK это то, что вы ищете:
Вы можете использовать эту команду, передавая список чисел через стандартный ввод или передавая файл, содержащий числа в качестве параметра.
источник
Следующие работы в bash:
источник
cat numbers.txt
шаг будет проблематичным.Вы можете использовать num-utils, хотя это может быть излишним для того, что вам нужно. Это набор программ для манипулирования числами в оболочке, и он может делать несколько изящных вещей, включая, конечно, их сложение. Это немного устарело, но они все еще работают и могут быть полезны, если вам нужно сделать что-то большее.
http://suso.suso.org/programs/num-utils/
источник
numsum numbers.txt
.Я понимаю, что это старый вопрос, но мне достаточно этого решения, чтобы поделиться им.
Если есть интерес, я объясню, как это работает.
источник
Чистый баш и в однострочнике :-)
источник
((
круглые скобки))
?$(< numbers.txt)
источник
Альтернативный чистый Perl, достаточно читаемый, никаких пакетов или опций не требуется:
источник
Для любителей Ruby
источник
Невозможно избежать отправки этого:
Это найдено здесь:
Самая элегантная однострочная оболочка Unix для суммирования списка чисел произвольной точности?
И вот его особые преимущества перед awk, bc и friends:
источник
Использование GNU
datamash
Util :Вывод:
Если входные данные нерегулярны, с пробелами и табуляциями в нечетных местах, это может сбить с толку
datamash
, тогда либо используйте-W
переключатель:... или используйте
tr
для очистки пробелов:источник
Моя версия:
источник
seq -s+ -5 10 | bc
Вы можете сделать это в Python, если вам удобно:
Не проверено, просто напечатано:
Себастьян указал на один строчный сценарий:
источник
cat
используется для демонстрации того, что скрипт работает как для stdin, так и для файлов в argv [] (какwhile(<>)
в Perl). Если ваш ввод находится в файле, тогда «<» не требуется.< numbers.txt
демонстрирует, что он работает на stdin так же хорошо, какcat numbers.txt |
и на. И это не учит плохим привычкам.Или вы можете ввести числа в командной строке:
Тем не менее, этот файл прихлебывает файл, поэтому не рекомендуется использовать его для больших файлов. Смотрите ответ j_random_hacker, который избегает лгать.
источник
Следующее должно работать (при условии, что ваш номер является вторым полем в каждой строке).
источник
Однострочник в ракетке:
источник
C (не упрощено)
источник
Заранее извиняюсь за удобочитаемость обратных кавычек ("` "), но они работают в оболочках, отличных от bash, и, следовательно, более удобны для вставки. Если вы используете оболочку, которая принимает его, формат $ (command ...) будет гораздо более читабельным (и, следовательно, отлаживаемым), чем `command ...`, поэтому не стесняйтесь изменять для вашего здравого смысла.
У меня есть простая функция в моем bashrc, которая будет использовать awk для вычисления количества простых математических элементов
Это будет делать +, -, *, /, ^,%, sqrt, sin, cos, круглые скобки .... (и многое другое в зависимости от вашей версии awk) ... вы можете даже получить фантазию с printf и форматированием с плавающей точкой выходной, но это все что мне обычно нужно
для этого конкретного вопроса я бы просто сделал это для каждой строки:
поэтому блок кода для суммирования каждой строки будет выглядеть примерно так:
Это если вы хотите суммировать их только построчно. Однако для каждого числа в файле данных
Кстати, если мне нужно сделать что-то быстро на рабочем столе, я использую это:
источник
$()
?