Jak mogę sumować liczby na liniach w pliku

8

Mam plik, który wygląda tak:

1
3
4
1
4
3
1
2

Jak mogę znaleźć w sumie to (tj. 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?

    
zadawane Tim 09.06.2016, 22:06
źródło

7 odpowiedzi

20

bc z niewielką pomocą z paste , aby uzyskać linie w jednym z + jako separatorem:

paste -sd+ file.txt | bc

Aby użyć wyjścia grep (lub dowolnego innego polecenia) zamiast pliku statycznego, przekaż STDOUT grep do STDIN z paste :

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

Przykład:

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

% paste -sd+ file.txt | bc
19

% grep . file.txt | paste -sd+ | bc
19

Jeśli musisz użyć bash , możesz użyć tablicy do zapisania zawartości pliku, a następnie iterować po elementach lub możesz czytać wiersz po wierszu i zsumować każdą linię, drugie podejście będzie bardziej wydajny:

$ 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
    
odpowiedział heemayl 09.06.2016, 22:08
źródło
10

Możesz także użyć awk. Aby policzyć całkowitą liczbę wierszy w plikach *. Txt zawierających słowo "hello":

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

Aby po prostu zsumować liczby w pliku:

awk '{n += }; END{print n}' file.txt
    
odpowiedział CrazyApe84 09.06.2016, 22:21
źródło
4

Użyj numsum z pakietu num-utils !

(Możesz potrzebować sudo apt-get install num-utils )

Polecenie numsum domyślnie spełnia to, czego potrzebujesz;

$ numsum file.txt 
19

Odczytywanie liczb testowych wiersz po linii z stdin :

$ printf '
1 
3
4
1
4
3
1
2' | numsum
19

Lub czytanie z jednej linii:

$ printf '1 3 4 1 4 3 1 2' | numsum -r
19


Więcej narzędzi

Pakiet zawiera kilka innych narzędzi do przetwarzania liczb, które zasługują na większą znajomość:

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

i bardziej ogólne polecenie kalkulatora numprocess ,
która stosuje wyrażenie z wiersza poleceń do liczb na liniach wejściowych.

    
odpowiedział Volker Siegel 10.06.2016, 04:54
źródło
1

Możesz użyć awk , natywnej aplikacji linuksowej przydatnej do skanowania i przetwarzania plików ze wzorcem na linię. Na twoje pytanie stworzy to, co chcesz:

awk 'BEGIN { sum=0 } { sum+= } END {print sum }' file.txt

Rury są również akceptowane:

cat file.txt | awk 'BEGIN { sum=0 } { sum+= } END {print sum }'
    
odpowiedział gwarah 09.06.2016, 22:32
źródło
0

Jest to dość proste użycie skryptów bash .

SUM=0; for line in 'cat file.txt'; do SUM=$((SUM + line)); done
    
odpowiedział zomfg_zombie 10.06.2016, 14:53
źródło
0

Rozwiązanie Perla:

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

Powyższe może sumować wszystkie liczby w wielu plikach:

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

Dla wielu plików podanych w wierszu poleceń, gdzie chcemy zobaczyć sumę liczb w pojedynczym pliku, możemy to zrobić:

$ perl -lnae '$c+=$_;if(eof){printf("%d %s\n",$c,$ARGV);$c=0}' input.txt input2.txt                                      
19 input.txt
15 input2.txt
    
odpowiedział Sergiy Kolodyazhnyy 03.06.2017, 00:04
źródło
0

Prosty -

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

sumuje liczby i daje sumę.

    
odpowiedział Sufyan Ramzan 13.02.2018, 10:54
źródło

Przeczytaj inne pytania na temat tagów