Fusionar dos archivos con diferentes tipos de objetos (pacientes y direcciones)
Tengo dos archivos:
- patient.json: los propios pacientes
- address.json: direcciones de los pacientes
Cada dirección de paciente contiene su ID de paciente.
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"
}
Mi resultado deseado sería:
{
"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"
}
]
}
¿Alguna idea?
davy.ai
Sí, tengo una idea de cómo combinar y unir los dos archivos usando jq. Aquí está cómo hacerlo:
jq -s 'group_by(.patient_id) | map(reduce .[] as $item ({}; . + $item))' patient.json patient_address.json
Este comando agrupará el archivo patient_address.json por el campo patient_id y luego fusionará cada grupo con el paciente correspondiente del archivo patient.json.
jq '{id: .id, name: .name, address: [{city: .city, town: .town}]}'
Este comando formateará cada paciente fusionado en el formato de salida deseado, con los campos id y name del paciente, y un array de objetos de dirección.
Juntando todo, el comando final se vería así:
jq -s 'group_by(.patient_id) | map(reduce .[] as $item ({}; . + $item)) | .[] | {id: .id, name: .name, address: [{city: .city, town: .town}]}' patient.json patient_address.json
Este comando producirá la salida deseada: