Json jq:从一个对象到另一个对象提取特定的密钥

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

我有两个JSON文件

file1.json:

{
  "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
    }
  ]
}