Calcula a soma de uma coluna usando shellscript

0

Eu tenho um arquivo csv como text.csv e quero calcular o salário total de todos os funcionários. Os dados são os seguintes:

Id,name,salary,designation
12,joe,thomas,253637,IT,admin
25,miacheal,364829,software engineer
46,mike,silva,adam, 374829479, senior, software, engineer
85,amber johnson,3728291,IT
24,Austin barclay, 3701830,software engineer

Eu tentei usar

awk -F "," '{ SUM_SALARY += $3 } END { print SUM_SALARY }'

mas a soma total está incorreta. Os dados reais tem 5,5 milhões de entradas.

    
por sneha 22.03.2017 / 05:21

2 respostas

1

Supondo que há um campo de salário migratório (que vagueia dos campos 3 a 5 e vice-versa), dois% GNT grep s podem isolar os salários e passá-los para numsum :

grep -o '[, ][[:digit:]]*,' test.csv | grep -o '[[:digit:]]*' | numsum 

Saída:

382878066
    
por 22.03.2017 / 07:03
1

Seus campos name contêm vírgulas, mas não são citados. Por isso, awk verá tipos diferentes de valores na coluna $3 de cada linha. Este seria o caso mesmo se eles fossem citados, mas no caso mostrado aqui, mesmo um analisador de CSV real não ajudará. Aqui está o que eu fiz para contornar isso:

awk 'BEGIN { FS=",,*"; print 0 }
     (NR > 1) { gsub("[^0-9,]",""); printf "%d+\n", $2 }
     END { print "pq" }' < text.csv \
| dc

Isso primeiro usa gsub para remover tudo o que não é um dígito ou vírgula em cada linha e, em seguida, imprime o valor da nova segunda coluna, em que as colunas são consideradas separadas por uma ou mais vírgulas. Os blocos BEGIN e END fazem os dados funcionarem com o formato dc expects.

Eu usei dc porque não sei se awk funciona como uma calculadora de precisão arbitrária e de propósito geral. Em caso afirmativo, você poderia fazer:

awk -F ',,*' '(NR > 1){ gsub("[^0-9,]",""); SUM_SALARY += $2 } END { print SUM_SALARY }' < text.csv

Este caso funciona muito parecido com o anterior, exceto que awk está fazendo a aritmética em vez de dc . Isso também usa a opção -F para definir o separador de campo, para evitar um bloco BEGIN sem uso.

    
por 22.03.2017 / 05:43