合并具有不同对象类型(患者和地址)的两个文件

Merge two files with different object types (patients and address)

我有两个文件:

每个地址患者都包含其患者 ID。

patients.json:

{
  id: 1,
  name: "name1"
}
{
  id: 2,
  name: "name2"
}

patient_address.json:

{
  patient_id: 1,
  city: "city1-1",
  town: "town1-1"
}
{
  patient_id: 1,
  city: "city1-2",
  town: "town1-2"
}
{
  patient_id: 2,
  city: "city2-1",
  town: "town2-1"
}

我想要的结果是:

{
  id: 1,
  name: "name1",
  address: [
  {
    city: "city1-1",
    town: "town1-1"
  },
  {
    city: "city1-2",
    town: "town1-2"
  }]
},
{
  id: 2,
  name: "name2",
  address: [
  {
    city: "city2-1",
    town: "town2-1"
  }]
}

有什么想法吗?

您的输入文件和预期输出无效 JSON,但暂时忽略它,您可以使用 jq 产生所需的转换,如下所示:

< patients.json jq --slurpfile address patient_address.json '
  (reduce $address[] as $a ({}; 
     .[ ($a.patient_id)|tostring].address += [$a | {city,town}] )) as $dict
  | . + $dict[.id|tostring]  
'

输出:

{
  "id": 1,
  "name": "name1",
  "address": [
    {
      "city": "city1-1",
      "town": "town1-1"
    },
    {
      "city": "city1-2",
      "town": "town1-2"
    }
  ]
}
{
  "id": 2,
  "name": "name2",
  "address": [
    {
      "city": "city2-1",
      "town": "town2-1"
    }
  ]
} 

有几种方法可以将您的输入转换为 JSON,例如使用 或类似工具。同样,如果您希望输出为 JSON 数组,您有多种选择,例如使用 map.

警告:上述解决方案假定 .id|tostring 不会发生任何冲突。例如,如果 .id 始终是整数,就会出现这种情况。