![他の列の変数に基づいて列の値の合計を取得するには? [コピー]](https://linux33.com/image/142662/%E4%BB%96%E3%81%AE%E5%88%97%E3%81%AE%E5%A4%89%E6%95%B0%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%A6%E5%88%97%E3%81%AE%E5%80%A4%E3%81%AE%E5%90%88%E8%A8%88%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
次の表データがあります
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
awk
1を基準に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