Reputation: 536
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
Reputation: 50750
You were really close.
.objects[] |= {uid, name, type, members: .members | map({uid, name, type, "ipv4-address"})}
Upvotes: 3