Usando o awk para somar os valores de uma coluna, com base nos valores de outra coluna

48

Estou tentando somar alguns números em uma coluna usando awk . Eu gostaria de somar apenas a coluna 3 dos "ferreiros" para obter um total de 212. Eu posso somar a coluna inteira usando awk , mas não apenas os "ferreiros". Eu tenho:

awk 'BEGIN {FS = "|"} ; {sum+=$3} END {print sum}' filename.txt

Também estou usando massa de vidraceiro. Obrigado por qualquer ajuda.

smiths|Login|2
olivert|Login|10
denniss|Payroll|100
smiths|Time|200
smiths|Logout|10
    
por jake 14.11.2015 / 05:56

4 respostas

57
awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
  • O sinalizador -F define o separador de campo; Eu coloquei entre aspas simples porque é um caractere especial de shell.
  • Em seguida, $1 ~ /smiths/ aplica o seguinte {bloco de código} somente às linhas em que o primeiro campo corresponde à regex /smiths/ .
  • O resto é igual ao seu código.

Note que, como você não está realmente usando um regex aqui, apenas um valor específico, você pode facilmente usar:

awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename

Que verifica a igualdade de strings. Isso é equivalente a usar o regex /^smiths$/ , como mencionado em outra resposta, que inclui a ^ anchor para corresponder apenas ao início da sequência (o início do campo 1) e à $ anchor para corresponder apenas ao final da corda. Não tenho certeza de como você está familiarizado com regexes. Eles são muito poderosos, mas nesse caso você poderia usar uma verificação de igualdade de strings com a mesma facilidade.

    
por 14.11.2015 / 06:05
13

Outra abordagem é usar arrays associativos awk, mais informações aqui . Esta linha produz a saída desejada:

awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt

Como efeito colateral, o array armazena todos os outros valores:

awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt

Saída:

smiths 212
denniss 100
olivert 10
    
por 14.11.2015 / 08:51
5

Muito bom até agora. Tudo o que você precisa fazer é adicionar um seletor antes do bloco para adicionar a soma. Aqui nós verificamos se o primeiro argumento contém apenas "smiths":

awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'

Você poderia reduzir isso um pouco, especificando o separador de campo como uma opção. Em awk , geralmente é uma boa ideia inicializar as variáveis na linha de comando:

awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'
    
por 14.11.2015 / 06:02
0
cat filename.txt | grep smiths | awk -F '|' '{sum+=$NF} END {print sum}'
  • -F opção para especificar o separador.
  • $NF é para "última coluna".
por 11.07.2017 / 12:10

Tags