Как я могу суммировать числа в строках в файле

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

1
3
4
1
4
3
1
2

Как я могу найти общее количество этого (например, 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19) ?

1
задан 9 June 2016 в 23:06

6 ответов

Вы также можете использовать awk. Чтобы подсчитать общее количество строк в файлах * .txt, содержащих слово «привет»:

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

Чтобы просто суммировать числа в файле:

awk '{n += $1}; END{print n}' file.txt
10
ответ дан 23 May 2018 в 10:09
  • 1
    Но если эта линия имеет значение «4», это не будет считаться 4 будет. Он будет считать 1. – Tim 9 June 2016 в 23:23
  • 2
    Нет, это будет 4. – CrazyApe84 9 June 2016 в 23:23
  • 3
    Я хочу, чтобы общее количество чисел в файле. Это делает это? – Tim 9 June 2016 в 23:24
  • 4
    Я думал, вы изменили свой вопрос на вывод grep. Я делал некоторые предположения. Я добавлю, как просто суммировать значения в файле. – CrazyApe84 9 June 2016 в 23:26
  • 5
    Да. Это действительно тот же ответ, что и у heemayl, но вместо пасты и bc он использует awk, что в конечном итоге дает гораздо большую гибкость. Тем не менее, его ответ хороший, и он был первым, поэтому он заслуживает вашего голоса! – CrazyApe84 9 June 2016 в 23:28

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

4
ответ дан 23 May 2018 в 10:09

Вы можете использовать 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
ответ дан 23 May 2018 в 10:09
  • 1
    Нет необходимости в блоке BEGIN{}, см. ответ CrazyApe84 . – terdon♦ 10 June 2016 в 13:39
  • 2
    Это избыточно для этой проблемы, но я предпочел включить ее из-за дидактической цели. – gwarah 10 June 2016 в 14:40
  • 3
    Но чему это учить? Это избыточно для каждой проблемы, awk не является C, вам не нужно устанавливать переменную перед ее использованием. Попробуйте awk 'BEGIN{print c+=1}'. – terdon♦ 10 June 2016 в 14:46
  • 4
    Блок BEGIN {} не был предназначен для инициализации переменных. Он принимает участие в разработке спецификации. Таким образом, по некоторым проблемам это может потребоваться. – gwarah 10 June 2016 в 18:12

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

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

Решение для 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
ответ дан 23 May 2018 в 10:09

Простой -

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

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

0
ответ дан 23 May 2018 в 10:09

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

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