다음 문제를 해결하도록 도와주실 수 있나요?
다음과 같은 입력이 있습니다.
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