jq: reduce and map combination



这里是我当前的jq脚本:

def reduce_generateId:
.[] | (. + {generalPractitionerCode: (.UAB_UP + "-" + .UAB_COD_UAB)});
def reduce_generalPractitioner($practitionerRole):
(reduce $practitionerRole[] as $g (
{};
.[$g.oid1 + "-" + $g.oid2].generalPractitioner += ($g | [.id])
)) as $dict
| $dict;
reduce_generateId | reduce_generalPractitioner($generalPractitioner)

我的jq命令是:

jq -s -f merge-patient.jq --argfile generalPractitioner reduced_ids.json reduced_pacient.json

其中reduced_pacient.json:

{ "UAB_UP": "00003", "UAB_COD_UAB": "3212", "INVENTAT": "02"}
{ "UAB_UP": "00006", "UAB_COD_UAB": "5881", "INVENTAT": "102"}
{ "UAB_UP": "00006", "UAB_COD_UAB": "5751", "INVENTAT": "102"}

reduced_ids.json:

[
{
"id": "3e67b455-8cdb-4bc0-a5e1-f90253870fc9",
"oid1": "04374",
"oid2": "INFP3"
},
{
"id": "0f22e5ff-70bc-457f-bdaf-7afe86d478de",
"oid1": "04376",
"oid2": "INF07"
}
]

正如您所看到的,redux_generalPractitioner直接返回$dict。我得到这个:

{
"04374-INFP3": {
"generalPractitioner": [
"3e67b455-8cdb-4bc0-a5e1-f90253870fc9"
]
},
"04376-INF07": {
"generalPractitioner": [
"0f22e5ff-70bc-457f-bdaf-7afe86d478de"
]
}
}
{
"04374-INFP3": {
"generalPractitioner": [
"3e67b455-8cdb-4bc0-a5e1-f90253870fc9"
]
},
"04376-INF07": {
"generalPractitioner": [
"0f22e5ff-70bc-457f-bdaf-7afe86d478de"
]
}
}
{
"04374-INFP3": {
"generalPractitioner": [
"3e67b455-8cdb-4bc0-a5e1-f90253870fc9"
]
},
"04376-INF07": {
"generalPractitioner": [
"0f22e5ff-70bc-457f-bdaf-7afe86d478de"
]
}
}

正如你所看到的,我得到了三次$dict

我不太明白为什么它生成三个$dict而不是一个。

如果我只执行reduce_generalPractitioner($generalPractitioner),我得到:

{
"04374-INFP3": {
"generalPractitioner": [
"3e67b455-8cdb-4bc0-a5e1-f90253870fc9"
]
},
"04376-INF07": {
"generalPractitioner": [
"0f22e5ff-70bc-457f-bdaf-7afe86d478de"
]
}
}

有什么想法吗?

您的程序输入reduced_pacient.json是一个由三个对象组成的流。当您设置了--slurp标志时,脚本的初始上下文是一个由三个元素组成的数组。

首先,您调用reduce_generateId,它通过迭代.[]将数组分解为三个项。因此CCD_ 12具有三个输出。

接下来,这些将通过管道输入到reduce_generalPractitioner函数中,从而运行三次。每次跑步产生一次$dict,总共产生三次。

记住:尽管函数reduce_generalPractitioner有一个输入参数,但它也有(就像jq中的每个过滤器一样(一个通用输入上下文(通过管道寻址(,它决定了.的值以及随后的运行次数。

最新更新