他の列の変数に基づいて列の値の合計を取得するには? [コピー]

他の列の変数に基づいて列の値の合計を取得するには? [コピー]

次の表データがあります

abc 1   1   1
bcd 2   2   4
bcd 12  23  3
cde 3   5   5
cde 3   4   5
cde 14  2   25

最初の列の変数に基づいて各列の値の合計を計算したいのですが、必要な結果は次のとおりです。

abc 1   1   1
bcd 14  25  7
cde 20  11  35

私はこのようにawkコマンドを使用します

awk -F"\t" '{for(n=2;n<=NF; ++n)a[$1]+=$n}END{for(i in a ) print i, a[i] }' tablefilepath

私が得た結果は次のとおりです。

abc 3
bcd 46
cde 66

私のコードの終わりが間違っているようですが、修正方法がわかりません。コードを修正するにはいくつかの指示が必要です。

答え1

あなたはかなり近いです。何が間違っているのか知っていますか? 3つを維持する必要がありましたが、各列1の値に対して1つの合計を維持しました。

これは次のようになります。イニアンの答えただし、必要な数の列を処理するように簡単に拡張できます。

awk -F"\t" '{for(n=2;n<=NF; ++n) a[$1][n]+=$n}
        END {for(i in a) {
                printf "%s", i
                for (n=2; n<=4; ++n) printf "\t%s", a[i][n]
                printf "\n"
             }
        }'

Inianの答えのような3つの配列ではなく、1つの2D配列を保持します。

答え2

ファイルがタブで区切られている限り、データ混合これにぴったりです。

$ datamash groupby 1 sum 2 sum 3 sum 4 < tablefilepath
abc     1       1       1
bcd     14      25      7
cde     20      11      35

Datamashは-t <delimiter>。ただし、タブはあなたが提供したサンプル入力に最も近いようです。

データ統合に慣れるこれは、入力が任意のスペースで区切られている場合に機能します(たとえば、タブのように見えるように意図された複数のスペースがある可能性があります)。それにもかかわらず、データが次のように見えても、datamashが期待する形式に簡単に統合できます。

sed -i 's/ \+/\t/g' tablefilepath

答え3

awk1を基準に2~4列の合計を出します。

awk -v FS="\t" -v OFS="\t" '{ col1[$1]+=$2; col2[$1]+=$3; col3[$1]+=$4; next } END { for ( i in col1) print i, col1[i], col2[i], col3[i]  }' file

関連情報