使用jq根据对象中variables的值select对象

我有以下的json文件:

{ "FOO": { "name": "Donald", "location": "Stockholm" }, "BAR": { "name": "Walt", "location": "Stockholm" }, "BAZ": { "name": "Jack", "location": "Whereever" } } 

我正在使用jq,并希望获得“位置”为“斯德哥尔摩”的对象的“名称”元素。

我知道我可以通过所有的名字

 cat json | jq .[] | jq ."name" "Jack" "Walt" "Donald" 

但我不知道如何打印只有特定的对象,给定一个子键的价值(这里"location" : "Stockholm" )。

大量的search主要是jQuery的东西,我发现了一个博客文章的答案:

 $ jq '.[] | select(.location=="Stockholm")' json { "location": "Stockholm", "name": "Walt" } { "location": "Stockholm", "name": "Donald" } 

从这里:http: //zerokspot.com/weblog/2013/07/18/processing-json-with-jq/

要获得一个正义名称的stream:

 $ jq '.[] | select(.location=="Stockholm") | .name' json 

生产:

 "Donald" "Walt" 

要获得相应的(键名称,“名称”属性)对的stream,请考虑:

 $ jq -c 'to_entries[] | select (.value.location == "Stockholm") | [.key, .value.name]' json 

输出:

 ["FOO","Donald"] ["BAR","Walt"] 

我有一个类似的相关问题:如果你想要原始的对象格式(与键名,例如FOO,BAR)?

Jq提供to_entriesfrom_entries在对象和键值对数组之间进行转换。 随着map周围的select

这些函数在一个对象和一个键值对的数组之间进行转换。 如果to_entries传递一个对象,则对于input中的每个k:v条目,输出数组包括{“key”:k,“value”:v}。

from_entries进行相反的转换,with_entries(foo)是to_entries |的缩写 map(foo)| from_entries,对于对对象的所有键和值进行一些操作很有用。 from_entries接受键,键,名称,名称,值和值作为键。

 jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries' { "FOO": { "name": "Donald", "location": "Stockholm" }, "BAR": { "name": "Walt", "location": "Stockholm" } } 

使用with_entries速记,这成为:

 jq15 < json 'with_entries(select(.value.location=="Stockholm"))' { "FOO": { "name": "Donald", "location": "Stockholm" }, "BAR": { "name": "Walt", "location": "Stockholm" } }