Contando e somando (e calculando a média) em uma matriz awk

1

Eu tenho um arquivo de dados que contém datas e medidas correspondentes de alguma quantidade. O arquivo completo se estende por 13 anos e tem ~ 4500 pontos de dados - eu dei um exemplo do formato abaixo. Não há necessariamente uma medida em cada dia, ou seja, algumas datas correspondem a um valor em branco na coluna de dados, intitulado "pbl".

Eu quero calcular, para cada ano do meu conjunto de dados, o número de observações (ou seja, uma contagem de valores diferentes de zero) e também a soma. Então eu vou repetir isso, mas para cada mês. Em termos de trapaça, adicionei colunas com as datas completas reduzidas para "ano" e "mês-ano" para facilitar isso.

Estou usando o awk e posso somar corretamente. O problema está contando. Atualmente minha linha de awk conta o número de dias por ano (ou por mês) e não o número de observações. Assim, para o conjunto de dados completo, recebo "365" ou "366", ou seja, o número total de entradas listadas na coluna de datas; o que eu quero é o número dessas datas que têm uma medida correspondente na coluna "pbl".

Meu palpite é que preciso incluir uma cláusula "para termos não-zero" em algum lugar ou contar com $ 4 em vez de $ 2, mas não posso descobrir como fazer isso. Alguma dica apreciada!

Meu código:

awk -F, '{a[$2]++; count[$2]+=$NF}END{for (i in a) print i,a[i],count[i]}' data.csv

Meus dados (amostra):

"date","year","month-year","pbl"

05/12/04,2004,"12-2004",960.295

06/12/04,2004,"12-2004",

13/12/04,2004,"12-2004",911.774

29/12/04,2004,"12-2004",2804.06

30/12/04,2004,"12-2004",4453.56

01/01/05,2005,"01-2005",1326.38

07/01/05,2005,"01-2005",

08/01/05,2005,"01-2005",604.919

09/01/05,2005,"01-2005",755.006

10/01/05,2005,"01-2005",

11/01/05,2005,"01-2005",978.818

12/01/05,2005,"01-2005",

13/01/05,2005,"01-2005",1644.87

29/04/05,2005,"04-2005",3630.62

30/04/05,2005,"04-2005",3780.11

01/05/05,2005,"05-2005",1262.66

02/05/05,2005,"05-2005",

14/02/06,2006,"02-2006",5667.58

15/02/06,2006,"02-2006",2696.56

23/07/07,2007,"07-2007",1276.06

24/07/07,2007,"07-2007",

    
por brendanvolc 07.11.2017 / 15:17

1 resposta

2

Você precisa processar apenas as linhas com um valor em $4 :

awk -F, '$4 {a[$2]++; count[$2]+=$NF}END{for (i in a) print i,a[i],count[i]}' data.csv

Isso funciona porque

$4 {a[$2]++; count[$2]+=$NF}

faz com que o bloco seja executado apenas nas linhas em que $4 é avaliado como verdadeiro, isto é, em que $4 é não-vazio e diferente de zero.

    
por 07.11.2017 / 15:27

Tags