JQ使用not搭配IN运算符无效无效果的问题咨询
jq中IN搭配NOT未生效问题解决
错误原因
问题根源不是IN和not的语法搭配错误,是两处逻辑写错了:
- 第一版加
| not的代码和原代码效果接近,是因为你用了.cells[]遍历当前行的所有单元格:- 原代码逻辑:只要当前行有任意一个单元格的值在$BL中,就选中这一行
- 加
| not后的逻辑:只要当前行有任意一个单元格的值不在$BL中,就选中这一行
实际业务里绝大多数行都会同时存在命中、未命中$BL的单元格,所以两个写法返回结果几乎一致,看起来not没有生效。
- 第二版把
not写在IN()括号里的写法完全不符合逻辑:not是布尔值取反操作,写在参数位置相当于先把$BL里的邮箱字符串全转成布尔值再取反(非空邮箱转成true后取反为false),拿真实邮箱字符串去匹配一堆false值,自然永远匹配不到,返回空结果。
正确写法
需要先明确判断范围,不要无差别遍历所有单元格:
- 如果你要筛选「整行所有单元格的值,全都不在$BL黑名单里」的行,用
all判断所有单元格都满足未命中条件:
jq --argjson BL ${BL} '.rows[] | select( all(.cells[]; .value | IN($BL[]) | not) )'
- 如果你明确知道邮箱存在cells的固定位置/固定字段下(比如第一个单元格存邮箱,或者单元格有
field: "email"的标识),直接定位到对应字段判断即可,性能更高也更准确:
# 示例:邮箱存在cells数组第一个元素的value字段中 jq --argjson BL ${BL} '.rows[] | select( .cells[0].value | IN($BL[]) | not )' # 示例:邮箱存在field属性为email的单元格的value中 jq --argjson BL ${BL} '.rows[] | select( .cells[] | select(.field == "email") | .value | IN($BL[]) | not )'
说明:
IN($BL[])返回布尔值后接| not是完全合法的jq语法,不存在特殊的搭配规则,问题核心是判断范围的逻辑错误。
内容的提问来源于stack exchange,提问作者jimmy306
相关产品推荐
相关产品推荐

