jq是否可以检查逗号分隔的值数组中的每个元素,以检查JSON中是否存在该值?

jq是否可以检查逗号分隔的值数组中的每个元素,以检查JSON中是否存在该值?,json,jq,Json,Jq,我有一个JSON文件,我正在使用jq从中提取数据。一个简单的用例是提取任何包含作为参数提供的Id的JSON对象 我使用以下简单脚本来执行此操作: [.]|选择(.id=$id)] 脚本存储在一个单独的文件中(by_id.jq),我使用-f参数传入该文件 完整命令如下所示: INDEX($ids | splits(","); .) as $dict | inputs | select($dict[.id]) jq -n --args a,b,c -f by_id.jq cat./my_json

我有一个JSON文件,我正在使用jq从中提取数据。一个简单的用例是提取任何包含作为参数提供的Id的JSON对象

我使用以下简单脚本来执行此操作:

[.]|选择(.id=$id)]

脚本存储在一个单独的文件中(
by_id.jq
),我使用
-f
参数传入该文件

完整命令如下所示:

INDEX($ids | splits(","); .) as $dict
| inputs
| select($dict[.id])
jq -n --args a,b,c -f by_id.jq
cat./my_json_file.json|jq-sf--arg ID“8df993c1-57d5-46b3-a8a3-d95066934e5b”。/by_ID.jq

是否有一种方法可以只使用jq,将逗号分隔的值列表作为参数传递给jq脚本,并遍历id,然后对照JSON文件中的
.id
值检查它们,结果是具有该id的对象

例如,如果我想根据三个对象的ID拉出三个对象,我希望以以下方式构造命令:


cat./my_json_file.json | jq-sf--arg ID“8df993c1-57d5-46b3-a8a3-d95066934e5b,1d5441ca-5758-474d-a9fc-40d0f68aa538,23cc618a-8ad4-4141-bc1c-0251y0663963”。/by_ID.jq
。尽管您需要将ID列表解析(拆分)为jq可以使用的内容,例如ID数组。然后,问题就变成了,给定一个键数组,选择具有这些ID中任何一个的对象。您可以使用找到的方法


我不确定你的输入看起来像什么,但从你使用的slurping然后过滤slurpped输入判断,这是一个对象流。这里不需要口吃。

这里有一种注重效率的方法

您的Q表示实际上您有一个对象流,因此提高效率的第一步是避免使用
-s
选项,而是将
-n
输入一起使用

第二步是避免多次拆分逗号分隔的值字符串

因此,您的脚本可能如下所示:

INDEX($ids | splits(","); .) as $dict
| inputs
| select($dict[.id])
jq -n --args a,b,c -f by_id.jq
调用如下所示:

INDEX($ids | splits(","); .) as $dict
| inputs
| select($dict[.id])
jq -n --args a,b,c -f by_id.jq

当然,这假设只要在“,”上拆分ID字符串就足够了。您可能需要调整值并注意其他潜在的异常情况。

为了提高效率,最好只拆分一次$ID

因此,如果必须使用-s选项,可以使用以下jq程序:

INDEX($ID | splits(","); .) as $dict
| .[]
| select($dict[.id])

这对我来说是最好的选择,但是目前我们使用的是1.5版,它在
中没有包含
,所以我必须想出一个解决办法,直到我可以升级到1.6版。我使用的解决方案是
[.]|。作为$json |选择($ID | split(“,”[]作为$stringArray |$stringArray |.==$json.ID)]
谢谢您的回答。我无法使用此选项,因为我们希望所有脚本使用与从Python调用的相同的标志,并且输入以预期的格式传递。@DanielMcC-您仍然可以使用此答案的第二部分,但由于这可能不清楚,我添加了一个单独的答案。