「商品id,カラー,サイズ,在庫数」のような並びのCSVがあったとして、
100ban,blk,20cm,2 101ban,wht,2.5mm,1 100ban,blk,20cm,1 205ban,-,20g,40 205ban,-,20g,500 . . .
これをソートしつつ、商品id,カラー,サイズが一致するものは在庫数を合計して出力したいとします。
まずはこのようなスクリプトを「sum.awk」などの名前で保存しておく
BEGIN{ FS = OFS = "," pid = cid = "" pcolor = ccolor = "" psize = csize = "" q = 0 } function print_line() { # 1行前までの合計値を出力 print pid, pcolor, psize, q # 在庫数をリセット q = 0 } # 現在の行の値 { cid = $1 ccolor = $2 csize = $3 } # 現在の行と、前行を比較して、商品が一致しなければprint NR != 1 && !(cid == pid && ccolor == pcolor && csize == psize) { print_line() } # 現在の行を前行として変数に格納し、次に送る { pid = cid pcolor = ccolor psize = csize # 結果出力させたい値はここで処理する q = q + $4 } END{ # 最終行はここで処理 print_line() }
コマンドラインでは、ブランク行を削除するawkと、sort、最後に上記のsum.awkとパイプします。
$ awk '$0 !~ /^$/ {print}' list | sort | awk -f sum.awk
するとこのようにソート&サムされつつディスティンクトなリストができます。
100ban,blk,20cm,3 101ban,wht,2.5mm,1 205ban,-,20g,540 . . .