
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+=line
poré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:
- Na verdade, não é usado
awk
da maneira que normalmente fazemos. Ele percorre explicitamente as linhas do arquivo em umBEGIN
bloco. Esta não é a maneira idiomática que normalmente se escreveawk
programas, que é fornecer padrões ou condições (opcionais) para blocos a serem executados para cada registro de entrada (linha). - 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
,sum
mas teria que dividir isso em20
e3
primeiro.
Com GNU awk
ou 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 awk
o 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'