使用jq根据属性筛选元素并获取指定字段值
解决jq筛选特定元素并提取属性的问题
嘿,作为jq新手碰到这种外层键不固定但内部结构一致的场景,其实很容易解决,我来给你一步步拆解~
首先,先模拟你描述的数组结构(方便你对照理解):
[ { "product_a": { "attr1": "foo", "attr2": "wanted_value", "attr3": false } }, { "product_b": { "attr1": "bar", "attr2": "not_wanted", "attr3": true } }, { "product_c": { "attr1": "baz", "attr2": "also_not_wanted", "attr3": false } } ]
核心思路
因为每个数组元素的外层键(比如product_a、product_b)不一样,但内部结构完全相同,我们需要先穿透这些外层包装,找到内部的属性结构,再筛选出attr3为真值的元素,最后提取它的attr2值。
基础解决方案
直接用这条jq命令就能搞定:
jq '.[][] | select(.attr3) | .attr2' your_input.json
命令拆解:
.[]:遍历数组中的每一个元素(也就是每个带不同外层键的对象).[][]:进一步提取每个外层对象里的唯一值(因为每个数组元素只有一个外层键,这一步会直接拿到包含attr1/attr2/attr3的内部对象)select(.attr3):筛选出attr3为真值的内部对象(jq里只要值不是false、null、0、空字符串这类“假值”,都会被判定为真).attr2:提取这个目标对象的attr2属性值
运行上面的示例数据,会输出:
"wanted_value"
更严谨的通用写法
如果担心某些数组元素可能有多个外层键(虽然你说只有一个),可以用to_entries来更稳妥地提取内部结构:
jq '.[] | to_entries[] | .value | select(.attr3) | .attr2' your_input.json
to_entries[]:把每个外层对象转换成{"key": "外层键名", "value": "内部结构"}的形式,再遍历这些键值对.value:取出键值对里的内部结构,后续步骤和之前一致
这样不管外层有多少个键,都能准确拿到所有内部结构再筛选~
内容的提问来源于stack exchange,提问作者Alejandro Echeverri




