두 번째 열을 기준으로 첫 번째 열의 합계를 구합니다.

두 번째 열을 기준으로 첫 번째 열의 합계를 구합니다.

나는 파일의 레코드 수(줄 수)와 디렉터리에 있는 파일 이름을 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자 너비의 정수로 형식화합니다.

관련 정보