awk를 사용하여 다른 열 값 추가

awk를 사용하여 다른 열 값 추가

다음 문제를 해결하도록 도와주실 수 있나요?

다음과 같은 입력이 있습니다.

pmNoNormalRabReleaseSpeech         1467   1281   1121   1046 

pmNoRabEstablishAttemptSpeech      1479   1282   1128   1026 

pmNoRabEstablishSuccessSpeech      1479   1280   1128   1025 

pmNoNormalRabReleaseSpeech         2637   2538   1948   1833 

pmNoNormalRabReleaseSpeech         2406   2423   1958   1803

pmNoRabEstablishAttemptSpeech      2717   2593   2001   1890 

pmNoRabEstablishSuccessSpeech      2712   2587   2000   1885

첫 번째 열의 각 고유 매개변수 이름이 각 개별 열의 값을 요약하기를 원합니다. 이는 awk가 다음을 출력하기를 원함을 의미합니다.

pmNoNormalRabReleaseSpeech 6510 6242 5027 4682

pmNoRabEstablishAttemptSpeech 4196 3875 3129 2916

답변1

출력 라인의 순서에 신경 쓰지 않는다고 가정하면(그렇다면 이는 사소한 조정입니다) 다차원 배열에 GNU awk를 사용하십시오.

awk '
    {
        for (i=2; i<=NF; i++) {
            cnt[$1][i] += $i
        }
    }
    END {
        for (key in cnt) {
            printf "%s", key
            for (i=2; i in cnt[key]; i++) {
                printf " %d", cnt[key][i]
            }
            print ""
        }
    }
' file
pmNoRabEstablishAttemptSpeech 4196 3875 3129 2916
pmNoNormalRabReleaseSpeech 6510 6242 5027 4682
pmNoRabEstablishSuccessSpeech 4191 3867 3128 2910

어떤 awk에 대해서도 이것은 다음과 같습니다.

awk '
    {
        keys[$1]
        for (i=2; i<=NF; i++) {
            cnt[$1,i] += $i
        }
    }
    END {
        for (key in keys) {
            printf "%s", key
            for (i=2; i<=NF; i++) {
                printf " %d", cnt[key,i]
            }
            print ""
        }
    }
' file
pmNoRabEstablishAttemptSpeech 4196 3875 3129 2916
pmNoNormalRabReleaseSpeech 6510 6242 5027 4682
pmNoRabEstablishSuccessSpeech 4191 3867 3128 2910

관련 정보