동일한 ID를 가진 열의 값의 누적 합계

동일한 ID를 가진 열의 값의 누적 합계

내 데이터 형식은 텍스트 파일입니다.

1     
1 2 
1 2  
1 4  
1 6  
2     
2 1 
2 2  
2 3 
2 4  
3     
3 1 
3 5   
3 9  
3 11  

ID가 같은 행(첫 번째 열)에 대해 이전 행에 2번째 열의 모든 값을 합한 열을 추가하고 싶습니다. 원하는 출력은 다음과 같습니다.

1     
1 2   
1 2   2
1 4   4
1 6   8
2     
2 1   0
2 2   1   
2 3   3
2 4   6
3     
3 1   0
3 5   1
3 9   6
3 11  14

내가 달성하려는 것은 다음과 같습니다.

awk -v OFS='' 'NR == 1 {
   next
}
{
   print $0, (NR > 1 && p1 == $1 ? " " (sum+=p2) : "")
}
{
   p1 = $1
   p2 = $2
}' input > output

하지만 이는 동일한 ID를 가진 값뿐만 아니라 2열의 모든 값을 합산한 것입니다. 따라서 ID=1의 출력은 정확하지만 분명히 더 나빠집니다.

1  2
1  2   2
1  4   4
1  6   8
2
2  1   8
2  2   9
2  3   11
2  4   14
3
3  1   14
3  5   15
3  9   20
3  11  29

올바른 부분만 포함하도록 합계를 어떻게 변경합니까? (동일한 ID를 가진 행)

답변1

카운트 증가뒤쪽에현재 줄을 인쇄합니다.

awk '{print $1, $2, sum[$1]; sum[$1] += $2}' file
1
1 2 0
1 2 2
1 4 4
1 6 8
2
2 1 0
2 2 1
2 3 3
2 4 6
3
3 1 0
3 5 1
3 9 6
3 11 15

이는 정의되지 않은 변수를 빈 문자열로 처리하거나 (숫자 컨텍스트에서) 0으로 처리하는 awk의 이점을 활용합니다.

0증분 합계를 인쇄 하지 않으려면 다음을 사용하십시오.

if ($2 != "") sum[$1] += $2

답변2

이는 불필요하게 복잡한 접근 방식처럼 보입니다. 적어도 당신이 보여준 예에서는 (잘 정렬되어 있음) 다음과 같이 하면 충분합니다.

$ awk '{ if($1 in a){print $0,a[$1]}else{print} if($2){a[$1]+=$2;}}' file 
1     
1 2 
1 2   2
1 4   4
1 6   8
2     
2 1 
2 2   1
2 3  3
2 4   6
3     
3 1 
3 5    1
3 9   6
3 11 15

0두 번째로 ID를 추가 하려는 경우 (ID 2와 3에 대해서는 이 작업을 수행했지만 ID 1에 대해서는 수행하지 않았기 때문에 원하는 출력이 명확하지 않습니다) 다음 작업을 수행할 수 있습니다.

$ awk '{ if($1 in a){print $0,a[$1]}else{a[$1]=0; print} if($2){a[$1]+=$2;}}' file
1     
1 2  0
1 2   2
1 4   4
1 6   8
2     
2 1  0
2 2   1
2 3  3
2 4   6
3     
3 1  0
3 5    1
3 9   6
3 11 15

답변3

$ awk 'NF == 1 { sum = 0 } NF > 1 { $(NF+1) = sum; sum += $2 }; 1' file
1
1 2 0
1 2 2
1 4 4
1 6 8
2
2 1 0
2 2 1
2 3 3
2 4 6
3
3 1 0
3 5 1
3 9 6
3 11 15

열이 하나만 있는 경우 누적 합계가 재설정됩니다. 열이 두 개 이상인 경우 합계를 업데이트하기 전에 현재 합계를 끝에 추가 열로 추가합니다. 그런 다음 추가 열을 추가하거나 추가하지 않고 현재 레코드가 무조건 출력됩니다(이것이 1Lonely가 수행하는 작업입니다).

이는 단일 열이 있는 각 행이 다른 누적 합계를 계산해야 하는 모든 행 앞에 오는 방식으로 파일이 정렬되어 있다고 가정합니다. 이것이 질문에 데이터가 표시되는 방식입니다.

관련 정보