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

 
 
 

§1023 · Posted By · 12月 5, 2012 · Development · Tags: , , · [Print]