Group Json data by a key
Today I learned how to group by json data by a key using jq
. In ruby
that's very trivial, it's just about using the group_by
method like that:
[
{name: "John", age: 35},
{name: "Bob", age: 40},
{name: "Wally", age: 35}
].group_by{|u| u[:age]}
# {
# 35=>[{:name=>"John", :age=>35}, {:name=>"Wally", :age=>35}],
# 40=>[{:name=>"Bob", :age=>40}]
# }
But using jq
I had to break it down to a few steps. So let's say that I have this json:
[
{"name": "John", "age": 35},
{"name": "Bob", "age": 40},
{"name": "Wally", "age": 35}
]
The idea is that we'll call the group_by(.age)[]
function to return multiple groups, then I pipe it to create a map with the age as the key. Finally we'll have these bunch of nodes not surounded by an array yet, so I am pipeing to a new jq
command to add with slurp:
cat data.json |
jq 'group_by(.age)[] | {(.[0].age | tostring): [.[] | .]}' |
jq -s add;
# {
# "35": [{"name": "John", "age": 35},{"name": "Wally", "age": 35}],
# "40": [{"name": "Bob", "age": 40}]
# }
Tweet