Como posso somar números em linhas em um arquivo

8

Eu tenho um arquivo que se parece com isso:

1
3
4
1
4
3
1
2

Como posso encontrar o total disso (ou seja, 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?

    
por Tim 09.06.2016 / 22:06

7 respostas

20

bc com uma pequena ajuda de paste para obter as linhas em uma única com + como separador:

paste -sd+ file.txt | bc

Para usar a saída de grep (ou qualquer outro comando) em vez de um arquivo estático, passe o STDOUT de grep para o STDIN de paste :

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

Exemplo:

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

% paste -sd+ file.txt | bc
19

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

Se você precisar usar bash , poderá usar uma matriz para salvar o conteúdo do arquivo e, em seguida, iterar os elementos ou ler o arquivo linha por linha e fazer a soma de cada linha, a segunda abordagem mais eficiente:

$ 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
    
por heemayl 09.06.2016 / 22:08
10

Você também pode usar o awk. Para contar o número total de linhas nos arquivos *. Txt que contêm a palavra "hello":

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

Para simplesmente somar os números em um arquivo:

awk '{n += }; END{print n}' file.txt
    
por CrazyApe84 09.06.2016 / 22:21
4

Use numsum do pacote num-utils !

(Você pode precisar de sudo apt-get install num-utils )

O comando numsum faz exatamente o que você precisa por padrão;

$ numsum file.txt 
19

Lendo os números de teste, linha por linha, de stdin :

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

Ou lendo uma linha:

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


Mais utilitários

O pacote contém alguns outros utilitários para processamento de números que merecem ser mais conhecidos:

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

e um comando de calculadora mais geral numprocess ,
que aplica uma expressão da linha de comando a números nas linhas de entrada.

    
por Volker Siegel 10.06.2016 / 04:54
1

Você pode usar o awk , um aplicativo linux nativo útil para escanear e processar arquivos com um padrão por linha. Para sua pergunta, isso produzirá o que você deseja:

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

Os tubos também são aceitos:

cat file.txt | awk 'BEGIN { sum=0 } { sum+= } END {print sum }'
    
por gwarah 09.06.2016 / 22:32
0

Este é um uso bastante simples de bash scripting.

SUM=0; for line in 'cat file.txt'; do SUM=$((SUM + line)); done
    
por zomfg_zombie 10.06.2016 / 14:53
0

Solução de Perl:

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

O acima pode somar todos os números em vários arquivos:

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

Para vários arquivos fornecidos na linha de comando, onde queremos ver a soma dos números em um arquivo individual, podemos fazer isso:

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

Simples -

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

adiciona os números e fornece o total.

    
por Sufyan Ramzan 13.02.2018 / 10:54

Tags