bccom uma pequena ajuda pastepara obter as linhas em uma única com +o 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 grepSTDOUT do para o STDIN de paste:
grep ....| paste -sd+| bc
Exemplo:
% cat file.txt
13414312% paste -sd+ file.txt | bc
19% grep . file.txt | paste -sd+| bc
19
Se você precisar usá bash-lo, poderá usar uma matriz para salvar o conteúdo do arquivo e iterar sobre os elementos ou ler o arquivo linha por linha e fazer a soma de cada linha, a segunda abordagem seria 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
Mas se essa linha tiver o valor "4", ela não contará 4, contará. Contará 1.
Tim
Não, ele contará 4. #
CrazyApe84 9/16
Eu quero o total dos números em um arquivo. Isso faz isso?
Tim
Eu pensei que você mudou sua pergunta para a saída de grep. Eu estava fazendo algumas suposições. Vou adicionar como simplesmente somar os valores em um arquivo.
9686 CrazyApe84
2
Sim. É realmente a mesma resposta que a de heemayl, mas, em vez de colar e bc, usa awk, o que acaba dando muito mais flexibilidade. Ainda assim, sua resposta é boa e ele foi o primeiro, por isso merece seu voto!
CrazyApe84
7
Use a numsumpartir da embalagem num-utils!
(Você pode precisar sudo apt-get install num-utils)
O comando numsumfaz exatamente o que você precisa por padrão;
$ numsum file.txt
19
Lendo os números dos testes linha por linha em stdin:
$ printf '
1
3
4
1
4
3
1
2'| numsum
19
Ou lendo de 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 mais geral da calculadora numprocess,
que aplica uma expressão da linha de comando aos números nas linhas de entrada.
Você pode usar awkum aplicativo linux nativo útil para varrer e processar arquivos com um padrão por linha. Para sua pergunta, isso produzirá o que você deseja:
awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }' file.txt
Tubos também são aceitos:
cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'
É redundante para esse problema, mas eu preferi incluí-lo devido a um objetivo didático.
gwarah
Mas o que isso ensina? É redundante para todos os problemas, awknão é C, você não precisa definir uma variável antes de usá-la. Tente awk 'BEGIN{print c+=1}'.
terdon
BEGIN {}O bloco não foi projetado apenas para inicializar variáveis. Participa na especificação do projeto. Portanto, em alguns problemas, pode ser necessário.
gwarah
0
Esse é um uso bastante simples de bashscript.
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
método.Respostas:
bc
com uma pequena ajudapaste
para obter as linhas em uma única com+
o separador:Para usar a saída de
grep
(ou qualquer outro comando) em vez de um arquivo estático, passe ogrep
STDOUT do para o STDIN depaste
:Exemplo:
Se você precisar usá
bash
-lo, poderá usar uma matriz para salvar o conteúdo do arquivo e iterar sobre os elementos ou ler o arquivo linha por linha e fazer a soma de cada linha, a segunda abordagem seria mais eficiente:fonte
cat file.txt | bc
?paste -sd+ -
. Por favor, altere isso.Você também pode usar o awk. Para contar o número total de linhas nos arquivos * .txt que contêm a palavra "olá":
Para simplesmente somar os números em um arquivo:
fonte
Use a
numsum
partir da embalagemnum-utils
!(Você pode precisar
sudo apt-get install num-utils
)O comando
numsum
faz exatamente o que você precisa por padrão;Lendo os números dos testes linha por linha em
stdin
:Ou lendo de uma linha:
Mais utilitários
O pacote contém alguns outros utilitários para processamento de números que merecem ser mais conhecidos:
e um comando mais geral da calculadora
numprocess
,que aplica uma expressão da linha de comando aos números nas linhas de entrada.
fonte
Você pode usar
awk
um aplicativo linux nativo útil para varrer e processar arquivos com um padrão por linha. Para sua pergunta, isso produzirá o que você deseja:Tubos também são aceitos:
fonte
BEGIN{}
bloqueio, veja a resposta do CrazyApe84 .awk
não é C, você não precisa definir uma variável antes de usá-la. Tenteawk 'BEGIN{print c+=1}'
.BEGIN {}
O bloco não foi projetado apenas para inicializar variáveis. Participa na especificação do projeto. Portanto, em alguns problemas, pode ser necessário.Esse é um uso bastante simples de
bash
script.fonte
Solução Perl:
O acima pode somar todos os números em vários arquivos:
Para vários arquivos fornecidos na linha de comando, onde queremos ver a soma dos números em um arquivo individual, podemos fazer o seguinte:
fonte
Simples -
soma os números e fornece o total.
fonte
Uma abordagem simples é usar um recurso interno do seu shell:
Isso lê seu arquivo em linha, resume e imprime o resultado.
Se você deseja usar um pipe e usar apenas a 1ª linha, funciona assim:
A obtenção do primeiro elemento é feita assim:
fonte