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