
「商品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 . . .
