我有一个带有其他对象集合的json对象。
使用jq
我需要能够修改一些对象,同时保持其他对象不变。
我一直在遇到可以获得更改的问题,但随后所有其他对象都消失了。或者我进行了更改,但它会影响其他所有对象。
以下是json的示例
{
"AAAA": {
"VALUES": {
"val_1": {
"key": "A_KEY1"
},
"val_2": {
"key": "A_KEY2"
}
}
},
"BBBB": {
"VALUES": {
"val_a": {
"key": "KEY1",
"old": [ 0, 1 ]
},
"val_b": {
"key": "KEY2",
"old": [ 2, 3 ]
}
}
}
}
我希望得到的是AAAA
对象没有变化,但是对于BBBB.VALUES
中的每个值,我想从old
数组中获取第二个值并创建一个新的关键价值说"新"
{
"AAAA": {
"VALUES": {
"val_1": {
"key": "A_KEY1"
},
"val_2": {
"key": "A_KEY2"
}
}
},
"BBBB": {
"VALUES": {
"val_a": {
"key": "KEY1",
"old": [ 0, 1 ],
"new": 1
},
"val_b": {
"key": "KEY2",
"old": [ 2, 3 ],
"new": 3
}
}
}
}
保证数组长两个元素,不需要修改数组。
我尝试了很多jq
的咒语,似乎无法让它发挥作用。
感谢
答案 0 :(得分:0)
您可以使用[ keys[] ]
来迭代BBBB.VALUES
下的密钥:
jq '(.BBBB.VALUES | . [ keys[] ]) |= .+ { new: .old[1] }' data.json
答案 1 :(得分:0)
如果理解with_entries/1
,可以使用易于阅读的解决方案:
.BBBB.VALUES
|= with_entries( .value.new = .value.old[1] ) )
或者更简单地说:
.BBBB.VALUES
|= with_entries( .value |= (.new = .old[1] ) )
答案 2 :(得分:0)
以下是使用 map_values
的解决方案$ awk '{print $NF}' <<< "$s"