![특정 열의 값을 기준으로 합계를 인쇄합니다.](https://linux55.com/image/118017/%ED%8A%B9%EC%A0%95%20%EC%97%B4%EC%9D%98%20%EA%B0%92%EC%9D%84%20%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C%20%ED%95%A9%EA%B3%84%EB%A5%BC%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
파일이 있습니다.
Name ID Savings
RK 1 10000
RS 2 10900
RK 1 1380
RS 2 10200
두 사람(RK와 RS)의 총 저축액을 구하고 싶습니다. 그래서 내가 원하는 예상 결과는 다음과 같습니다.
RK 1 11380 (i.e 10000 + 1380)
RS 2 21100 (i.e 10900 + 10200)
답변1
$ awk 'NR > 1 { s[$2] += $3; n[$2] = $1 } END { for (i in s) { print n[i], i, s[i] }}' file
RS 2 21100
RK 1 11380
우리는 두 개의 배열을 사용합니다. 하나는 합계( )를 저장 s
하고 다른 하나는 이름( n
)을 저장합니다. 배열의 인덱싱은 ID를 사용하여 수행됩니다(같은 이름을 가진 사람이 여러 명 있을 수 있으므로 이를 인덱스로 사용하지 않습니다).
입력의 각 행(헤더 행 제외)에 대해 합계를 업데이트하고 이름을 저장합니다. 마지막으로 저장된 정보를 확인하고 인쇄해보겠습니다.
답변2
사용 awk
:
awk 'NR>1{seen[$1FS$2]+=$NF} END{for (x in seen) print x, seen[x]}' in
이는 전체 열 #1과 열 #2를 읽고 필드 구분 기호를 FS
그대로 유지합니다(예: 명명된 array의 공백) seen
. 그리고 $1FS$2
마지막 필드 값의 각 고유 조합을 합산합니다.
마지막으로 x
배열을 변수로 반복하여 배열을 반복하고 $1FS$2
값과 해당 합계를 먼저 인쇄합니다 seen[x]
.
이것이 in
입력 파일 이름이 됩니다. NR>1
헤더 행을 건너뛰고 있습니다 .오른쪽에코코드질소숫자=1 NR>1
.