2014-11-02 108 views
101

鉴于此输入:如何根据jq内部数组中的值过滤对象数组?

[ 
    { 
    "Id": "cb94e7a42732b598ad18a8f27454a886c1aa8bbba6167646d8f064cd86191e2b", 
    "Names": [ 
     "condescending_jones", 
     "loving_hoover" 
    ] 
    }, 
    { 
    "Id": "186db739b7509eb0114a09e14bcd16bf637019860d23c4fc20e98cbe068b55aa", 
    "Names": [ 
     "foo_data" 
    ] 
    }, 
    { 
    "Id": "a4b7e6f5752d8dcb906a5901f7ab82e403b9dff4eaaeebea767a04bac4aada19", 
    "Names": [ 
     "jovial_wozniak" 
    ] 
    }, 
    { 
    "Id": "76b71c496556912012c20dc3cbd37a54a1f05bffad3d5e92466900a003fbb623", 
    "Names": [ 
     "bar_data" 
    ] 
    } 
] 

我试图构建一个过滤器jq返回所有对象Id s表示包含在内Names阵列中的“数据”,与输出是换行符 - 分隔。对于上述数据,我想输出是

cb94e7a42732b598ad18a8f27454a886c1aa8bbba6167646d8f064cd86191e2b 
a4b7e6f5752d8dcb906a5901f7ab82e403b9dff4eaaeebea767a04bac4aada19 

我觉得我有点接近这一点:

(. - select(.Names[] contains("data"))) | .[] .Id 

select过滤器是不正确的,它不会编译(获得error: syntax error, unexpected IDENT)。

回答

171

非常接近!在您的select表达式中,您必须在contains之前使用管道(|)。

此过滤器产生预期的输出。

. - map(select(.Names[] | contains ("data"))) | .[] .Id 

jq Cookbook有一个语法的例子。

Filter对象基础上的一个关键

例如内容,我只想对象,它们的风格键包含“家”。

$ json='[{"genre":"deep house"}, {"genre": "progressive house"}, {"genre": "dubstep"}]' 
$ echo "$json" | jq -c '.[] | select(.genre | contains("house"))' 
{"genre":"deep house"} 
{"genre":"progressive house"} 

Colin D询问如何保存阵列的JSON结构,使得最终的输出是单个JSON阵列而不是JSON对象流。

最简单的方法是包装在一个数组构造整个表达式:

$ echo "$json" | jq -c '[ .[] | select(.genre | contains("house")) ]' 
[{"genre":"deep house"},{"genre":"progressive house"}] 

您也可以使用地图功能:

$ echo "$json" | jq -c 'map(select(.genre | contains("house")))' 
[{"genre":"deep house"},{"genre":"progressive house"}] 

地图解包输入阵列,所述滤波器适用于每个元素,并创建一个新的数组。换句话说,map(f)相当于[.[]|f]

+0

感谢,伟大工程!我确实看到了这个例子,我只是没有把它适应到我的场景:-) – 2014-11-02 16:56:01

+0

有没有办法“保留数组的json结构”?我喜欢这个流派的例子,但它输出两个“json行”。我无法弄清楚地图部分 – 2016-08-25 12:32:44

+0

@ColinD,检查我的更新为两种解决方案。 – 2016-08-25 14:43:10

3

下面是使用any/2

map(select(any(.Names[]; contains("data"))|not)|.Id)[] 

与样本数据的另一个解决方案和-r选项它产生

cb94e7a42732b598ad18a8f27454a886c1aa8bbba6167646d8f064cd86191e2b 
a4b7e6f5752d8dcb906a5901f7ab82e403b9dff4eaaeebea767a04bac4aada19 
相关问题