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

おすすめ記事