Как мне сложить числа в строках в файле?

У меня есть файл, который выглядит следующим образом:

1
3
4
1
4
3
1
2

Как я могу найти общую сумму (т.е. 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?

22
задан 10 June 2016 в 09:06

8 ответов

bc с небольшой справкой от paste для получения строк в единственной с + как разделитель:

paste -sd+ file.txt | bc

Для использования вывода grep (или любая другая команда) вместо этого статический файл передайте grep STDOUT к STDIN paste:

grep .... | paste -sd+ | bc

Пример:

% cat file.txt            
1
3
4
1
4
3
1
2

% 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
40
ответ дан 10 June 2016 в 09:06

Вы могли использовать awk, также. Для подсчета общего количества строк в *.txt файлы, которые содержат слово "привет":

grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'

Для простого подведения итогов чисел в файле:

awk '{n += $1}; END{print n}' file.txt
18
ответ дан 10 June 2016 в 09:06

Можно использовать 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 }'
1
ответ дан 10 June 2016 в 09:06

Используйте 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


утилиты More

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

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,
калькулятора, которая применяет выражение от командной строки до чисел на входных строках.

6
ответ дан 10 June 2016 в 09:06

Это - довольно простое использование bash сценарии.

SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done
0
ответ дан 10 June 2016 в 09:06

Решение для Perl:

$ perl -lnae '$c+=$_;END{print $c}' input.txt                                                                            
19

Вышеупомянутое может суммировать все числа через несколько файлов:

$ perl -lnae '$c+=$_;END{print $c}' input.txt input2.txt                                                                 
34

Для нескольких файлов, данных на командной строке, где мы хотим видеть сумму чисел в отдельном файле, мы можем сделать это:

$ perl -lnae '$c+=$_;if(eof){printf("%d %s\n",$c,$ARGV);$c=0}' input.txt input2.txt                                      
19 input.txt
15 input2.txt
0
ответ дан 10 June 2016 в 09:06

Простой подход должен использовать встроенную функцию Вашей оболочки:

SUM=0; while read N; do SUM=$((SUM+N)); done </path/to/file
echo $SUM

Это читает Ваш файл linewise, подводит итог и печатает результат.

, Если Вы хотите использовать канал и только использовать 1-ю строку, это работает как это:

SUM=0
your_command | while read -r LINE; do for N in $LINE; do break; done; SUM=$((SUM+N)); done
echo $SUM

Получение первого элемента сделано как это:

LIST="foo bar baz"
for OBJ in $LIST; do break; done
echo $OBJ

foo
0
ответ дан 29 September 2019 в 13:29

Простой -

awk '{total+=$1} END{print total}' file

складывает числа и дает Вам общее количество.

0
ответ дан 23 November 2019 в 01:30

Другие вопросы по тегам:

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