Como eu escrevo um script que soma os números em um arquivo?

2

Eu gostaria de resumir números em um arquivo de texto simples. Existe alguma maneira eu posso fazer isso com um comando ou um script bash?

Digamos que eu queira extrair o número em um padrão assim:

… text text …
Removed 50 items out of 50 items.
… text text …
Removed 34 items out of 50 items.
… text text …

Portanto, no caso acima, gostaria de extrair o primeiro número nas linhas que aparecem e resumir. No exemplo, o resultado deve ser 84. Eu sei como grep, mas essa é a extensão do meu conhecimento dos comandos * nix.

    
por Spoike 27.06.2011 / 13:23

4 respostas

6

Tente

  grep Removed filename | awk '{sum += $2} END { print "sum=", sum }'

ou

 awk '/Removed/ { sum += $2 } END { print "sum=", sum }' filename
    
por 27.06.2011 / 14:51
4

com o perl você escreveria isto:

perl -a -n -e '$sum += $F[1] if $F[0] eq "Removed"; END { print $sum }'  filename(s)

Onde -a média autosplit em espaços no array @F $ F [0] é o primeiro elemento onde o palavra Removido deve ser e $ F [1] é o segundo elemento.

-n significa passar por cima dos arquivos dados na linha de comando, linha por linha

-e significa, pegue a próxima string como o script (em vez de um arquivo)

Se você está rodando em janelas nativas (eu vejo no comentário mencionando Cygwin) então você poderia usar o pacote "Padre on Strawberry" para tudo isso, embora devido às diferentes camadas você trocaria os caracteres 'e'.

    
por 27.06.2011 / 15:46
1

Às vezes, quero resumir várias colunas que aparecem em um arquivo. Este script resume colunas que "parecem numéricas"

#!/usr/bin/perl -w
#
# csum
#
# Sum up numerical fields in a text file
#

my $i;
my @sum;

while (<>)
{
    print;
    my @F = split;
    for $i (0..$#F)
    {
        if ($F[$i] =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
        {
            $sum[$i] += $F[$i];
        }
    }
}

print "-" x 75 . "\n";
print join "\t", map {$_ or ""} @sum;
print "\n";
    
por 11.07.2011 / 04:09
1
if [ $# -ne 1 ]
then
    echo "Usage: $0   number"
    echo "       I will find sum of all digit for given number"
    echo "       For eg. $0 123, I will print 6 as sum of all digit (1+2+3)"
    exit 1
fi

n=$1
sum=0
sd=0
while [ $n -gt 0 ]
do
    sd='expr $n % 10'
    sum='expr $sum + $sd'
    n='expr $n / 10'
done
    echo  "Sum of digit for numner is $sum"
    
por 13.09.2011 / 13:20

Tags