使用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_entries
和from_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" } }