Search code examples
jsoneditjqin-place

Filter only part of input using select


Given input like this:

{
  "type": "collection",
  "foo": "bar",
  "children": [
    {
      "properties": {
        "country": "GB"
      },
      "data": "..."
    },
    {
      "properties": {
        "country": "PL"
      },
      "data": "..."
    }
  ]
}

How can I use jq to retain all of the JSON structure, but filter out some of the children using select(). For instance, If I wanted to return only children with country GB, I would expect the following output:

{
  "type": "collection",
  "foo": "bar",
  "children": [
    {
      "properties": {
        "country": "GB"
      },
      "data": "..."
    }
  ]
}

If I only want the children, this is easy with .children[] | select(.properties.country == "GB"), but does not retain the rest of the JSON.


Solution

  • The key is to use |=. In the present case, you could use the following pattern:

    .children |= map(select(...))