AWK como contar a soma

AWK como contar a soma

arquivo de entrada (FileInput.txt):

10 20 3 100 5 3 27

este é o meu script awk:

BEGIN{ while((getline line < "FileInput.txt") > 0) { }

como posso contar a soma? Tentei, sum+=lineporém, soma apenas a primeira coluna.

Responder1

Algo como pode fazer o trabalho:

awk 'BEGIN {sum=0} {for (i = 1; i <= NF; i++) sum+=$i} END {print sum}' FileInput.txt

Responder2

O problema com seu código é duplo:

  1. Na verdade, não é usado awkda maneira que normalmente fazemos. Ele percorre explicitamente as linhas do arquivo em um BEGINbloco. Esta não é a maneira idiomática que normalmente se escreve awkprogramas, que é fornecer padrões ou condições (opcionais) para blocos a serem executados para cada registro de entrada (linha).
  2. Como a entrada consiste em registros (por padrão, linhas únicas) com mais de um número, você teria que tratar esses registros de forma que os números individuais fossem somados. Em outras palavras, você não pode adicionar 20 3, summas teria que dividir isso em 20e 3primeiro.

Com GNU awkou mawk, podemos definir o separador de registro, RS, como uma expressão regular que corresponda a qualquer sequência de caracteres de espaço em branco em vez da nova linha padrão. Isso faz com que awko arquivo seja lido como uma coleção de registros de campo único separados por espaços em branco. Somá-los e imprimir a soma no final é trivial:

$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168

Alternativamente,

$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168

Ou você pode fazer alguma variante emo que Romeu Ninov mostra, que consiste em percorrer os campos de cada linha,

$ awk '{ for (i = 1; i <= NF; ++i) sum += $i } END { print sum }' file
168

Responder3

Você pode transformar seu arquivo para ter um número por linha:

tr -s '[:blank:]' '\n' < FileInput.txt

Em seguida, escolha uma solução dehttps://stackoverflow.com/q/2702564/7552para resumi-los. Por exemplo

tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'

informação relacionada