반복 열 합계에 열을 추가하는 awk 명령

반복 열 합계에 열을 추가하는 awk 명령

다음과 같은 데이터 세트 탭이 있습니다.

A  B  C  D
1  aaa 1 2
1  aaa 3 4
1  aaa 5 6
1  bbb 7 8
1  ccc 9 1
1  ccc 2 3
1  ddd 4 5
1  ddd 6 7
1  ddd 8 9
1  ddd 1 2

그룹 B의 C 합계를 표시하기 위해 새 열 E를 추가하고 싶습니다.

원하는 출력:

A  B  C  D E
1  aaa 1 2 9
1  aaa 3 4 9
1  aaa 5 6 9
1  ddd 4 5 19
1  ddd 6 7 19
1  ddd 8 9 19
1  ddd 1 2 19

답변1

awk 'BEGIN{ FS=OFS="\t" }
  NR==FNR{ 
    if (FNR>1) a[$2]+=$3
    next
  }
  { $(NF+1)=(FNR==1 ? "E" : a[$2]) }
  1
' file file

입력 파일을 두 번 읽습니다. 첫 번째 실행에서는 헤더 행( if (FNR>1)...)을 건너뛰고 field 값이 key 가 있는 배열 값에 추가됩니다 $3. 계속 녹음하세요.a$2next

두 번째 실행에서는 첫 번째 행에 E새 필드를 할당하거나 $(NF+1)다른 행에 할당된 값을 할당합니다. a[$2]기록을 인쇄합니다.

산출:

A       B       C       D       E
1       aaa     1       2       9
1       aaa     3       4       9
1       aaa     5       6       9
1       bbb     7       8       7
1       ccc     9       1       11
1       ccc     2       3       11
1       ddd     4       5       19
1       ddd     6       7       19
1       ddd     8       9       19
1       ddd     1       2       19

관련 정보