繰り返し列の合計に列を追加する awk コマンド

繰り返し列の合計に列を追加する awk コマンド

次のデータセットタブがあります。

A  B  C  D
1  aaa 1 2
1  aaa 3 4
1  aaa 5 6
1  bbb 7 8
1  ccc 9 1
1  ccc 2 3
1  ddd 4 5
1  ddd 6 7
1  ddd 8 9
1  ddd 1 2

グループBのCの合計を表示するために新しい列Eを追加したいと思います。

希望の出力:

A  B  C  D E
1  aaa 1 2 9
1  aaa 3 4 9
1  aaa 5 6 9
1  ddd 4 5 19
1  ddd 6 7 19
1  ddd 8 9 19
1  ddd 1 2 19

答え1

awk 'BEGIN{ FS=OFS="\t" }
  NR==FNR{ 
    if (FNR>1) a[$2]+=$3
    next
  }
  { $(NF+1)=(FNR==1 ? "E" : a[$2]) }
  1
' file file

入力ファイルを2回読みます。最初の実行では、ヘッダー行(if (FNR>1)...)をスキップし、フィールド値をキーを持つ配列値に追加します$3。続けて録音してください。a$2next

2番目の実行では、最初の行にE新しいフィールドを割り当てるか、$(NF+1)別の行に割り当てられた値を割り当てます。a[$2]履歴を印刷します。

出力:

A       B       C       D       E
1       aaa     1       2       9
1       aaa     3       4       9
1       aaa     5       6       9
1       bbb     7       8       7
1       ccc     9       1       11
1       ccc     2       3       11
1       ddd     4       5       19
1       ddd     6       7       19
1       ddd     8       9       19
1       ddd     1       2       19

関連情報