![두 번째 열을 기준으로 첫 번째 열의 합계를 구합니다.](https://linux55.com/image/126472/%EB%91%90%20%EB%B2%88%EC%A7%B8%20%EC%97%B4%EC%9D%84%20%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%97%B4%EC%9D%98%20%ED%95%A9%EA%B3%84%EB%A5%BC%20%EA%B5%AC%ED%95%A9%EB%8B%88%EB%8B%A4..png)
나는 파일의 레코드 수(줄 수)와 디렉터리에 있는 파일 이름을 output.txt 파일에 저장하는 Bash 스크립트를 작성했습니다.
출력 .txt 파일은 다음과 같습니다.
No.ofRecord FileName delimiter
563394 1--UnixfileName.txt 28
364794 2--UnixfileName.txt 28
785895 3--UnixfileName.txt 28
99778453 1--NextUnixFileName.txt 18
95645453 2--NextUnixFileName.txt 18
99745313 3--NextUnixFileName.txt 18
원하는 결과
출력.txt
No.ofRecord FileName delimiter
563394 1--UnixfileName.txt 28
364794 2--UnixfileName.txt 28
785895 3--UnixfileName.txt 28
99778453 1--NextUnixFileName.txt 18
95645453 2--NextUnixFileName.txt 18
99745313 3--NextUnixFileName.txt 18
TOTAL :
1714083 UnixfileName
295169219 NextUnixFileName
노트:
파일 이름이 UnixFileName과 유사한 경우 No.ofRecord를 합산합니다.
파일 이름이 NextUnixFileName과 유사하면 No.ofRecord가 합산됩니다.
미리 감사드립니다.
답변1
$ awk 'NR > 1 { k = substr($2, 4); cnt[k] += $1 } { print } END { print "\nTOTAL:"; for (k in cnt) print cnt[k], k }' file
No.ofRecord FileName delimiter
563394 1--UnixfileName.txt 28
364794 2--UnixfileName.txt 28
785895 3--UnixfileName.txt 28
99778453 1--NextUnixFileName.txt 18
95645453 2--NextUnixFileName.txt 18
99745313 3--NextUnixFileName.txt 18
TOTAL:
1714083 UnixfileName.txt
295169219 NextUnixFileName.txt
스크립트 는 네 번째 문자에서 시작하는 awk
키를 기반으로 첫 번째 열을 k
두 번째 열로 합산합니다. 이는 첫 번째 줄(헤더)을 제외한 파일의 모든 입력 줄에서 수행됩니다. 모든 입력 라인은 수정되지 않은 채 출력으로 전달됩니다.
마지막으로, 발견된 각 키의 총 개수를 인쇄합니다.
합계의 열 너비를 나머지 데이터와 동일하게 만들려면 마지막 열을 print cnt[k], k
다음 형식으로 변경할 수 있습니다.
printf("%-15d%s\n", cnt[k], k)
숫자를 왼쪽 정렬된 15자 너비의 정수로 형식화합니다.