Paul
Paul

Reputation: 536

jq transform outer and inner array

This seems like it should be easy. I have a json file, and all I want is less of it - the structure stays the same. I am missing some ah-ha moment. What I am trying to do is get the some of the main array details and for each member, some of the inner details.

So for this:

{
  "objects" : [ {
    "uid" : "fc5d20ad-03d5-4684-8836-feae73d1fe",
    "name" : "group1",
    "type" : "group",
    "members" : [ {
      "uid" : "7846f4d6-72e0-4cd8-8795-1f5bc2f124",
      "name" : "member1",
      "type" : "host",
      "ipv4-address" : "17.19.49.10",
      "comments" : "",
      "color" : "black",
      "icon" : "Objects/host",
      "tags" : [ ],
      "meta-info" : {
        "lock" : "unlocked",
        "validation-state" : "ok",
        "last-modify-time" : {
          "posix" : 1626407214607,
          "iso-8601" : "2021-07-16T13:46+1000"
        },
        "last-modifier" : "",
        "creation-time" : {
          "posix" : 1625632725273,
          "iso-8601" : "2021-07-07T14:38+1000"
        },
        "creator" : "user"
      },
      "read-only" : false
    }, {
      "uid" : "a5b12fed-e32e-4151-8310-4848f16bef",
      "name" : "member2",
      "type" : "host",
      "domain" : {
        "uid" : "41e821a0-3720-11e3-aa6e-00200c9fde",
        "name" : "SMC ",
        "domain-type" : "domain"
      },
      "ipv4-address" : "12.19.50.10",
      "interfaces" : [ ],
      "nat-settings" : {
        "auto-rule" : false
      },
      "comments" : "",
      "color" : "black",
      "icon" : "Objects/host",
      "tags" : [ ],
      "meta-info" : {
        "lock" : "unlocked",
        "validation-state" : "ok",
        "last-modify-time" : {
          "posix" : 1626407292367,
          "iso-8601" : "2021-07-16T13:48+1000"
        },
        "last-modifier" : "user",
        "creation-time" : {
          "posix" : 1625632759552,
          "iso-8601" : "2021-07-07T14:39+1000"
        },
        "creator" : "user"
      },
      "read-only" : false
    } ],
    "comments" : "",
    "color" : "black",
    "icon" : "General/group",
    "tags" : [ ],
    "meta-info" : {
      "lock" : "unlocked",
      "validation-state" : "ok",
      "last-modify-time" : {
        "posix" : 1626407413393,
        "iso-8601" : "2021-07-16T13:50+1000"
      },
      "last-modifier" : "user",
      "creation-time" : {
        "posix" : 1625633894300,
        "iso-8601" : "2021-07-07T14:58+1000"
      },
      "creator" : "user"
    },
    "read-only" : false
  }, {
    "uid" : "e8d4f757-98e8-4aae-bc31-772066d",
    "name" : "group2",
    "type" : "group",
    "domain" : {
      "uid" : "41e821a0-3720-11e3-aa6e-0800c9fde",
      "name" : "SMC ",
      "domain-type" : "domain"
    },
    "members" : [ {
      "uid" : "84e89b9c-dbe7-441e-9859-2d0eef",
      "name" : "member1",
      "type" : "host",
      "domain" : {
        "uid" : "41e821a0-3720-11e3-aa6e-08fde",
        "name" : "SMC ",
        "domain-type" : "domain"
      },
      "ipv4-address" : "82.19.76.10",
      "interfaces" : [ ],
      "nat-settings" : {
        "auto-rule" : false
      },
      "comments" : "",
      "color" : "black",
      "icon" : "Objects/host",
      "tags" : [ ],
      "meta-info" : {
        "lock" : "unlocked",
        "validation-state" : "ok",
        "last-modify-time" : {
          "posix" : 1626398340102,
          "iso-8601" : "2021-07-16T11:19+1000"
        },
        "last-modifier" : "user",
        "creation-time" : {
          "posix" : 1625632518542,
          "iso-8601" : "2021-07-07T14:35+1000"
        },
        "creator" : "user"
      },
      "read-only" : false
    }, {
      "uid" : "116f3792-8baa-4e56-888bcbd8194",
      "name" : "member2",
      "type" : "host",
      "domain" : {
        "uid" : "41e821a0-3720-e3-aa6e-0c9fde",
        "name" : "member3",
        "domain-type" : "domain"
      },
      "ipv4-address" : "84.12.48.10",
      "interfaces" : [ ],
      "nat-settings" : {
        "auto-rule" : false
      },
      "comments" : "",
      "color" : "black",
      "icon" : "Objects/host",
      "tags" : [ ],
      "meta-info" : {
        "lock" : "unlocked",
        "validation-state" : "ok",
        "last-modify-time" : {
          "posix" : 1626398367303,
          "iso-8601" : "2021-07-16T11:19+1000"
        },
        "last-modifier" : "user",
        "creation-time" : {
          "posix" : 1625632577299,
          "iso-8601" : "2021-07-07T14:36+1000"
        },
        "creator" : "user"
      },
      "read-only" : false
    } ],
    "comments" : "",
    "color" : "black",
    "icon" : "General/group",
    "tags" : [ ],
    "meta-info" : {
      "lock" : "unlocked",
      "validation-state" : "ok",
      "last-modify-time" : {
        "posix" : 1626398715255,
        "iso-8601" : "2021-07-16T11:25+1000"
      },
      "last-modifier" : "user",
      "creation-time" : {
        "posix" : 1625632984944,
        "iso-8601" : "2021-07-07T14:43+1000"
      },
      "creator" : "user"
    },
    "read-only" : false
  } ]
}

I want to end up with this:

{
  [ {
    "uid" : "fc5d20ad-03d5-4684-8836-feae73d1fe",
    "name" : "group1",
    "type" : "group",
    "members" : [ {
      "uid" : "7846f4d6-72e0-4cd8-8795-1f5bc2f124",
      "name" : "member1",
      "type" : "host",
      "ipv4-address" : "17.19.49.10",
    }, {
      "uid" : "a5b12fed-e32e-4151-8310-4848f16bef",
      "name" : "member2",
      "type" : "host",
      "ipv4-address" : "12.19.50.10",
    } ],
   
  }, {
    "uid" : "e8d4f757-98e8-4aae-bc31-772066d",
    "name" : "group2",
    "type" : "group",
    "members" : [ {
      "uid" : "84e89b9c-dbe7-441e-9859-2d0eef",
      "name" : "member1",
      "type" : "host",
      "ipv4-address" : "82.19.76.10",
      },
    }, {
      "uid" : "116f3792-8baa-4e56-888bcbd8194",
      "name" : "member2",
      "type" : "host",
      "ipv4-address" : "84.12.48.10",
    } ]
  } ]
}

But I can't figure out how to get the member details out. This is what I have so far:

cat groups.txt | jq '.objects[] | { name: .name, uid: .uid, type: .type, members: .members[] | { name: .name, uid: .uid, "ipv4-address": ."ipv4-address", type: .type } }'

This repeats everything for each member, so I need an "inner loop" to deal with the members and I can't see it:

{
  "name": "group1",
  "uid": "fc5d20ad-03d5-4684-8836-feae73d1fe",
  "type": "group",
  "members": {
    "name": "member1",
    "uid": "7846f4d6-72e0-4cd8-8795-1f5bc2f124",
    "ipv4-address": "17.19.49.10",
    "type": "host"
  }
}
{
  "name": "group1",
  "uid": "fc5d20ad-03d5-4684-8836-feae73d1fe",
  "type": "group",
  "members": {
    "name": "member2",
    "uid": "a5b12fed-e32e-4151-8310-4848f16bef",
    "ipv4-address": "12.19.50.10",
    "type": "host"
  }
}
[snip]

How do I keep them together, and keep the surrounding array?

Upvotes: 2

Views: 100

Answers (1)

oguz ismail
oguz ismail

Reputation: 50750

You were really close.

.objects[] |= {uid, name, type, members: .members | map({uid, name, type, "ipv4-address"})}

Online demo

Upvotes: 3

Related Questions