Json jq:从一个对象到另一个对象提取特定的密钥
我有两个JSON文件 file1.json:Json jq:从一个对象到另一个对象提取特定的密钥,json,jq,Json,Jq,我有两个JSON文件 file1.json: { "Fruits": [ { "name": "Apple", "something_else": 123, "id": 652090 }, { "name": "Orange", "something_else": 456, "id": 28748 } ]} file2.json: { "Fruits": [ { "weight": 5, "id": 6
{
"Fruits": [
{
"name": "Apple",
"something_else": 123,
"id": 652090
},
{
"name": "Orange",
"something_else": 456,
"id": 28748
}
]}
file2.json:
{
"Fruits": [
{
"weight": 5,
"id": 652090
},
{
"weight": 7,
"id": 28748
}
]}
如果两个文件都有一个公用键“id”,我想合并它们,但只从file1提取“name”属性。我如何使用jq实现这一点
这就是我想要的:
{
"Fruits": [
{
"name": "Apple",
"weight": 5,
"id": 652090
},
{
"name": "Orange",
"weight": 7,
"id": 28748
},
]}
组合
水果
数组,按id
对其进行分组,选择包含2个元素的组,因为我们希望水果出现在两个文件中。对于每个选定的组;将名称
字段从第一个组元素添加到第二个,并在数组中收集结果
jq -n '[inputs.Fruits[]]
| reduce (group_by(.id)[] | select(length==2)) as $f
([]; . + [$f[1] + ($f[0] | {name})])' file1.json file2.json
请注意,命令行中给出的订单文件很重要,带有名称的文件应在另一个文件之前给出
组合具有相同id
的对象并提取字段子集要容易得多:
jq -n '[inputs.Fruits[]]
| group_by(.id)
| map(select(length==2) | add | {name, id, weight})
' file1.json file2.json
组合水果
数组,按id
对其进行分组,选择包含2个元素的组,因为我们希望水果出现在两个文件中。对于每个选定的组;将名称
字段从第一个组元素添加到第二个,并在数组中收集结果
jq -n '[inputs.Fruits[]]
| reduce (group_by(.id)[] | select(length==2)) as $f
([]; . + [$f[1] + ($f[0] | {name})])' file1.json file2.json
请注意,命令行中给出的订单文件很重要,带有名称的文件应在另一个文件之前给出
组合具有相同id
的对象并提取字段子集要容易得多:
jq -n '[inputs.Fruits[]]
| group_by(.id)
| map(select(length==2) | add | {name, id, weight})
' file1.json file2.json
有很多方法可以构建它。还有一种方法:
$ jq '.Fruits |= (. + input.Fruits | [group_by(.id)[] | add | {name,weight,id}])' \
file1.json file2.json
{
"Fruits": [
{
"name": "Orange",
"weight": 7,
"id": 28748
},
{
"name": "Apple",
"weight": 5,
"id": 652090
}
]
}
有很多方法可以构建它。还有一种方法:
$ jq '.Fruits |= (. + input.Fruits | [group_by(.id)[] | add | {name,weight,id}])' \
file1.json file2.json
{
"Fruits": [
{
"name": "Orange",
"weight": 7,
"id": 28748
},
{
"name": "Apple",
"weight": 5,
"id": 652090
}
]
}