2つのフィールドでファイルの内容をグループ化し、3番目のフィールドを合計します。

2つのフィールドでファイルの内容をグループ化し、3番目のフィールドを合計します。

以下にファイルがあり、3番目のフィールドを合計してグループの最初と2番目のフィールドに基づいて計算したいと思います。

文書

 AAA~111~2
 BBB~111~2
 AAA~111~1
 AAA~111~3
 AAA~222~2

期待される出力

 AAA~111~6~3
 BBB~111~2~1
 AAA~222~2~1

これまで、私のコードは3番目の列だけを要約しました。

 awk 'BEGIN { FS=OFS=SUBSEP="~"}{arr[$1,$2]+=$3 }END {for (i in arr) print i,arr[i]}' File

ベストアンサー1

合計を追跡するのと同じ方法で、単に数を追跡できます。

$ awk -F'~' 'BEGIN { SUBSEP = OFS = FS } { s[$1,$2] += $3; ++c[$1,$2] } END { for (i in s) { print i, s[i], c[i] } }' file
AAA~111~6~3
BBB~111~2~1
AAA~222~2~1

datamash単純な記録形式のデータについて、合計などの基本を計算する方法を知っているGNUなどのツールを選択することもできます。

$ datamash -t '~' -s groupby 1,2 sum 3 count 3 <file
AAA~111~6~3
AAA~222~2~1
BBB~111~2~1

ここで、datamash入力は行ベースのレコードのチルダで区切られたフィールドとして扱われるべきです。各グループのすべてのレコードの 3 番目のフィールドの合計と、各グループのレコード数で構成される 2 つの新しいフィールドを追加しながら、最初の 2 つのフィールドのデータをグループ化します。

入力データが最初の2つのフィールドでソートされている場合は、この-sオプションを削除できます。

おすすめ記事