次の問題を解決するのに役立ちますか?
次の入力があります。
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