以下にファイルがあり、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
オプションを削除できます。