jq · lesson 18 of 32 · Aggregation

Sort, group & unique

sort_by(key) orders an array, group_by(key) buckets its elements into arrays, and unique drops duplicates. flatten merges nested arrays.

Examples

Example 1Sort by a field

Document

{
  "team": "Platform",
  "office": { "city": "Berlin", "floor": 3 },
  "members": [
    { "name": "Ada", "age": 36, "role": "lead", "active": true,
      "email": "[email protected]", "skills": ["rust", "sql"] },
    { "name": "Linus", "age": 28, "role": "dev", "active": true,
      "email": null, "skills": ["c", "shell"] },
    { "name": "Grace", "age": 45, "role": "dev", "active": false,
      "skills": ["cobol"] },
    { "name": "Alan", "age": 41, "role": "qa", "active": true,
      "email": "[email protected]", "skills": [] }
  ]
}

Query

.members | sort_by(.age) | map(.name)
  1. sort_by(.age) Order the members by age, youngest first.
  2. map(.name) Keep just the names.

Result

["Linus","Ada","Alan","Grace"]

Try it in the playground

Example 2Group by a field

Document

{
  "team": "Platform",
  "office": { "city": "Berlin", "floor": 3 },
  "members": [
    { "name": "Ada", "age": 36, "role": "lead", "active": true,
      "email": "[email protected]", "skills": ["rust", "sql"] },
    { "name": "Linus", "age": 28, "role": "dev", "active": true,
      "email": null, "skills": ["c", "shell"] },
    { "name": "Grace", "age": 45, "role": "dev", "active": false,
      "skills": ["cobol"] },
    { "name": "Alan", "age": 41, "role": "qa", "active": true,
      "email": "[email protected]", "skills": [] }
  ]
}

Query

.members | group_by(.role) | map({role: .[0].role, names: map(.name)})
  1. group_by(.role) An array of arrays: one group per distinct role.
  2. map( For each group…
  3. {role: .[0].role, names: map(.name)} …build a summary: the role (taken from the group's first member) and every name in it.

Result

[
  {"role":"dev","names":["Linus","Grace"]},
  {"role":"lead","names":["Ada"]},
  {"role":"qa","names":["Alan"]}
]

Try it in the playground

Example 3Flatten and de-duplicate

Document

{
  "team": "Platform",
  "office": { "city": "Berlin", "floor": 3 },
  "members": [
    { "name": "Ada", "age": 36, "role": "lead", "active": true,
      "email": "[email protected]", "skills": ["rust", "sql"] },
    { "name": "Linus", "age": 28, "role": "dev", "active": true,
      "email": null, "skills": ["c", "shell"] },
    { "name": "Grace", "age": 45, "role": "dev", "active": false,
      "skills": ["cobol"] },
    { "name": "Alan", "age": 41, "role": "qa", "active": true,
      "email": "[email protected]", "skills": [] }
  ]
}

Query

.members | map(.skills) | flatten | unique
  1. map(.skills) An array of skill arrays.
  2. flatten Merge the nested arrays into one flat array.
  3. unique Sort it and drop duplicates.

Result

["c","cobol","rust","shell","sql"]

Try it in the playground

Good to know

  • reverse flips an array, so sort_by(.age) | reverse sorts oldest first.
  • unique_by(.role) keeps one element per distinct role.

About jsonquery

Query, format and learn JSON with jq, JSONPath, JMESPath and JSON Pointer. It is the engine of the desktop app, run in your browser.

Engine
The desktop app’s, compiled to WebAssembly
Licence
MIT (the engine and the app)
Source
GitHub
Contact
The contact form (private)
Public issues
GitHub
Legal
Privacy policy

Known limitations: a file over 10 MB opens read-only and one over 512 MB does not open here; the desktop app has no such limit.