jq报错无法迭代null:如何获取GRCH38关联refpos的最小offset值?
获取嵌套refpos中GRCH38关联offset最小值的jq命令修复
问题场景
需要从每个嵌套的refpos数组中,筛选出assembly为GRCH38的条目,提取其offset并取最小值。现有命令能输出所有符合条件的offset,但使用map结合min函数时触发错误:
jq: error (at :1): Cannot iterate over null (null)
修复后的命令
基础版(仅在有匹配条目时返回最小值)
.refpos | map(select(.assembly == "GRCH38").offset) | select(length > 0) | min
兼容版(无匹配条目时返回null,避免报错)
.refpos | map(select(.assembly == "GRCH38").offset) // [] | if length > 0 then min else null end
错误原因解析
当refpos中没有任何assembly为GRCH38的条目时,map(select(.assembly == "GRCH38").offset)会返回null而非空数组。min函数只能处理数组类型,无法迭代null,因此抛出错误。
修复逻辑核心:
- 用
// []将可能的null转换为空数组,确保后续操作对象为数组类型 - 调用
min前判断数组是否有元素,避免空数组调用min导致新错误
示例验证
测试数据1(含GRCH38条目)
{ "refpos": [ {"assembly": "GRCH38", "offset": 150}, {"assembly": "GRCH38", "offset": 80}, {"assembly": "GRCh37", "offset": 220} ] }
执行修复命令后返回:80
测试数据2(无GRCH38条目)
{ "refpos": [ {"assembly": "GRCh37", "offset": 220} ] }
执行兼容版命令后返回:null(无报错)
内容的提问来源于stack exchange,提问作者Robin Rounthwaite
相关产品推荐
相关产品推荐

