首页 > 解决方案 > jq 可以检查逗号分隔的值数组的每个元素以检查该值是否存在于 JSON 中?

问题描述

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

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

[.[] | select(.id == $ID)]

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

完整的命令如下所示:

cat ./my_json_file.json | jq -sf --arg ID "8df993c1-57d5-46b3-a8a3-d95066934e5b" ./by_id.jq

有没有办法只使用 jq 可以将逗号分隔的值列表作为参数传递给 jq 脚本并遍历 id 并.id根据 JSON 文件中的值检查它们,结果是具有的对象那个身份证?

例如,如果我想通过它们的 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

标签: jsonjq

解决方案


当然。尽管您需要将该 id 列表解析(拆分)为 jq 可以使用的东西,例如 id 数组。然后你的问题就变成了,给定一个键数组,选择具有任何这些 id 的对象。您可以使用此处找到的方法。

$ jq --arg ID '8df993c1-57d5-46b3-a8a3-d95066934e5b,1d5441ca-5758-474d-a9fc-40d0f68aa538,23cc618a-8ad4-4141-bc1c-0251y0663963' '
select(.id | IN($ID|split(",")[]))
' ./my_json_file.json

我不确定您的输入是什么样的,但根据您使用 slurping 然后过滤 slurped 输入来判断,它是一个对象流。这里不需要啜饮。


推荐阅读