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
修正された質問に答えてください
最初のユニークサイトの3番目の列を4番目の列にコピーするにはどうすればよいですか?
$ 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