使用jq的IN内置函数替换选择条件时遇到的异常问题
jq 1.6中IN函数使用错误导致筛选结果为空的原因
问题场景
给定JSON数组:
[ [ "gpu" ], [ "disk" ] ]
需求是筛选出第一个元素为"gpu"的子数组,使用普通条件map(select(.[0] == "gpu"))能得到正确结果[["gpu"]],但使用map(select(.[0] | IN(["gpu"])))却返回空数组。
核心原因
jq 1.6的IN()函数不接受数组作为直接参数,它的设计逻辑是接收多个独立的值。当你传入["gpu"]时,函数会判断目标值(这里是字符串"gpu")是否等于这个数组对象,显然字符串和数组属于不同类型的元素,判断结果为false,因此select过滤不到任何元素,最终返回空数组。
正确用法
直接传入单个匹配值
将数组参数改为单独的值:
map(select(.[0] | IN("gpu")))
基于数组集合进行匹配
如果需要用数组作为匹配集合,需要通过[]展开数组中的元素,让IN()逐个判断:
# 通过参数定义匹配数组,再执行筛选 jq --argjson targets '["gpu"]' 'map(select(.[0] | IN($targets[])))' input.json
以上两种写法都能得到预期的筛选结果[["gpu"]]。
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

