subtrair a linha anterior com base em outra coluna

0

Estou tentando descobrir como subtrair a linha anterior com base em outra coluna usando o AWK. Aqui está a entrada:

site year count
040130013 1997 34
040130013 1998 55
040130019 2006 79
040130019 2007 135
040130019 2008 151
040130019 2009 172
040130019 2010 179

Aqui está a saída desejada:

site year count  app
040130013 1997 34   34
040130013 1998 55   21
040130019 2006 79   79
040130019 2007 135  56
040130019 2008 151  16
040130019 2009 172  21
040130019 2010 179  7

Basicamente, para o mesmo site (coluna 1), subtraia a linha anterior usando a coluna 3 e anexe-a como a nova coluna. Aqui está o que eu tentei:

awk '($1 in arr){$4 = $3 - prev3; prev3 = $3; print;}{arr[$1]++}' infile

mas não funciona.

    
por kelly 15.05.2016 / 16:45

1 resposta

2

Resposta para a pergunta original

Com apenas pequenas alterações no seu código:

$ awk 'NR==1{$4="app"} ($1 in arr){$4 = $3 - prev3;} {prev3 = $3; arr[$1]; print}' infile
site year count app
040130013 1997 34
040130013 1998 55 21
040130019 2006 79
040130019 2007 135 56
040130019 2008 151 16
040130019 2009 172 21
040130019 2010 179 7

A principal mudança é que prev3 = $3; arr[$1]; print é feito para cada linha e não apenas para as linhas para as quais ($1 in arr) .

Como a steeldriver sugeriu, não precisamos salvar os locais em uma matriz:

$ awk 'NR==1{$4="app"} $1==prev1{$4=$3-prev3;} {prev3=$3; prev1=$1; print}' infile
site year count app
040130013 1997 34
040130013 1998 55 21
040130019 2006 79
040130019 2007 135 56
040130019 2008 151 16
040130019 2009 172 21
040130019 2010 179 7

Resposta para a pergunta revisada

how about if I want to copy the third column to fourth column for the first unique site?

$ awk 'NR==1{$4="app"} {$4=$3;} $1==prev1{$4=$3-prev3;} {prev3=$3; prev1=$1; print}' infile
site year count count
040130013 1997 34 34
040130013 1998 55 21
040130019 2006 79 79
040130019 2007 135 56
040130019 2008 151 16
040130019 2009 172 21
040130019 2010 179 7
    
por 15.05.2016 / 17:53

Tags