根据另一列减去上一行

根据另一列减去上一行

我试图弄清楚如何使用 AWK 根据另一列减去上一行。这是输入:

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

这是所需的输出:

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

基本上,对于同一站点(第 1 列),使用第 3 列减去前一行并将其附加为新列。这是我尝试过的:

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

但它不起作用。

答案1

回答原来的问题

只需对您的代码进行少量更改:

$ 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

关键的变化是prev3 = $3; arr[$1]; print对每一行都进行此操作,而不仅仅是针对($1 in arr).

正如 Steeldriver 建议的那样,我们不需要将位置保存在数组中:

$ 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

回答修改后的问题

如果我想将第一个唯一站点的第三列复制到第四列怎么样?

$ 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

相关内容