bcс небольшой помощью, pasteчтобы получить строки в качестве +разделителя:
paste -sd+ file.txt | bc
Чтобы использовать вывод grep(или любую другую команду) вместо статического файла, передайте grepSTDOUT в STDIN paste:
grep ....| paste -sd+| bc
Пример:
% cat file.txt
13414312% paste -sd+ file.txt | bc
19% grep . file.txt | paste -sd+| bc
19
Если вы должны использовать bash, то вы можете использовать массив для сохранения содержимого файла, а затем перебирать элементы или вы можете читать файл построчно и делать сумму для каждой строки, второй подход будет более эффективным:
$ time { nums=$(<file.txt);for i in ${nums[@]};do(( sum+=i ));done; echo $sum ;}19
real 0m0.002s
user 0m0.000s
sys 0m0.000s
$ time {while read i;do(( sum+=i ));done<file.txt; echo $sum ;}19
real 0m0.000s
user 0m0.000s
sys 0m0.000s
Но если эта строка имеет значение «4», она не будет считаться 4, не так ли? Это будет считаться 1.
Тим
Нет, это будет считаться 4.
CrazyApe84
Я хочу общее количество чисел в файле. Это делает это?
Тим
Я думал, что вы изменили свой вопрос на вывод grep. Я делал некоторые предположения. Я добавлю, как просто суммировать значения в файле.
CrazyApe84
2
Да. Это действительно тот же ответ, что и у Heemayl, но вместо paste и bc он использует awk, что в конечном итоге дает гораздо большую гибкость. Тем не менее, его ответ хорош, и он был первым, поэтому он заслуживает вашего голоса!
CrazyApe84
7
Используйте numsumиз пакета num-utils!
(Вам может понадобиться sudo apt-get install num-utils)
Команда numsumделает то, что вам нужно по умолчанию;
$ numsum file.txt
19
Чтение номеров тестов построчно из stdin:
$ printf '
1
3
4
1
4
3
1
2'| numsum
19
Или читая из одной строки:
$ printf '1 3 4 1 4 3 1 2'| numsum -r
19
Больше коммунальных услуг
Пакет содержит некоторые другие утилиты для обработки чисел, которые заслуживают большей известности:
numaverage - find the average of the numbers, or the mode or median
numbound - find minimum of maximum of all lines
numgrep - to find numbers matching ranges or sets
numinterval - roughly like the first derivative
numnormalize - normalize numbers to an interval, like 0-1
numrandom - random numbers from ranges or sets, eg odd.
numrange - similar to seq
numround - round numbers up, down or to nearest
и более общая команда калькулятора numprocess,
которая применяет выражение из командной строки к числам во входных строках.
Вы можете использовать awkнативное приложение linux для сканирования и обработки файлов с шаблоном на строку. По вашему вопросу это даст то, что вы хотите:
awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }' file.txt
Трубы также принимают:
cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'
Это избыточно для этой проблемы, но я предпочел включить ее из-за дидактической цели.
Гвара
Но чему это учит? Это избыточно для каждой проблемы, awkэто не C, вам не нужно устанавливать переменную перед ее использованием. Попробуй awk 'BEGIN{print c+=1}'.
тердон
BEGIN {}Блок не был предназначен только для инициализации переменных. Он принимает участие в разработке дизайна. Итак, по некоторым проблемам это может понадобиться.
Гвара
0
Это довольно простое использование bashсценариев.
SUM=0;for line in`cat file.txt`;do SUM=$((SUM + line));done
cat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]
badge_count
метод.Ответы:
bc
с небольшой помощью,paste
чтобы получить строки в качестве+
разделителя:Чтобы использовать вывод
grep
(или любую другую команду) вместо статического файла, передайтеgrep
STDOUT в STDINpaste
:Пример:
Если вы должны использовать
bash
, то вы можете использовать массив для сохранения содержимого файла, а затем перебирать элементы или вы можете читать файл построчно и делать сумму для каждой строки, второй подход будет более эффективным:источник
cat file.txt | bc
?paste -sd+ -
. Пожалуйста, исправьте это.Вы также можете использовать awk. Чтобы подсчитать общее количество строк в файлах * .txt , содержащих слово «привет»:
Чтобы просто сложить числа в файле:
источник
Используйте
numsum
из пакетаnum-utils
!(Вам может понадобиться
sudo apt-get install num-utils
)Команда
numsum
делает то, что вам нужно по умолчанию;Чтение номеров тестов построчно из
stdin
:Или читая из одной строки:
Больше коммунальных услуг
Пакет содержит некоторые другие утилиты для обработки чисел, которые заслуживают большей известности:
и более общая команда калькулятора
numprocess
,которая применяет выражение из командной строки к числам во входных строках.
источник
Вы можете использовать
awk
нативное приложение linux для сканирования и обработки файлов с шаблоном на строку. По вашему вопросу это даст то, что вы хотите:Трубы также принимают:
источник
BEGIN{}
блоке, см . Ответ CrazyApe84 .awk
это не C, вам не нужно устанавливать переменную перед ее использованием. Попробуйawk 'BEGIN{print c+=1}'
.BEGIN {}
Блок не был предназначен только для инициализации переменных. Он принимает участие в разработке дизайна. Итак, по некоторым проблемам это может понадобиться.Это довольно простое использование
bash
сценариев.источник
Perl решение:
Выше может суммировать все числа в нескольких файлах:
Для нескольких файлов, указанных в командной строке, где мы хотим видеть сумму чисел в отдельном файле, мы можем сделать это:
источник
Просто -
складывает числа и дает вам общее количество.
источник
Простой подход заключается в использовании встроенной функции вашей оболочки:
Это читает ваш файл, подводит итоги и печатает результат.
Если вы хотите использовать канал и использовать только 1-й ряд, он работает так:
Получение первого элемента делается так:
источник