データをある列をキーにまとめる方法
今やっている仕事で、以下のようなデータを
主キー | 並び順 | 親コード |
100 | 07 | p00 |
101 | 02 | p00 |
102 | 01 | p01 |
103 | 06 | p02 |
104 | 05 | p02 |
105 | 03 | p02 |
106 | 10 | p03 |
107 | 04 | p04 |
108 | 09 | p05 |
109 | 08 | p05 |
以下のようにしたい場面がありました。
親コード | 主キーをまとめたもの |
p00 | 101、100 |
p01 | 102 |
p02 | 105、104、103 |
p03 | 106 |
p04 | 107 |
p05 | 109、108 |
親コードでグルーピングして、並び順で並び替えたあとに、主キーを「、」で連結します。
Oracle でそんなクエリがあったような気もしますが、ここは男らしく(?)awk でやってみました。
まず元のデータを org.dat として保存。
以下のコマンドを発行。
sort -k2,1 org.dat | awk 'BEGIN {\ previous = ""; } { if (previous != "" && previous != $3) { printf("%s\t%s\n", previous, nameList); nameList = ""; } if (nameList != "") { nameList = nameList "、"; } nameList = nameList $1; previous = $3; } END { printf("%s\t%s\n", previous, nameList); }'
まず sort で親キー、並び順で並び替え、awk でもげもげしています。
今更ながら、awk って繰り返し処理なのに for 文を書かないで良いという。
便利だな~