web-dev-qa-db-ja.com

jqを使ってオブジェクトの変数の値に基づいてオブジェクトを選択する

次のjsonファイルがあります。

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

私はjqを使用していて、 'location'が 'Stockholm'であるオブジェクトの "name"要素を取得したいです。

私は私がすべての名前を得ることができることを知っています

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

しかし、サブキーの値(ここでは"location" : "Stockholm")を考えると、特定のオブジェクトだけを印刷する方法を理解することはできません。

168
Daniel

グーグルが主に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/

239
Daniel

名前だけのストリームを取得するには

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

生成されます:

"Donald"
"Walt"

対応する(キー名、「名前」属性)ペアのストリームを取得するには、以下の点を考慮してください。

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

出力:

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

私は同様の関連した質問をしました:もしあなたがオリジナルのオブジェクトフォーマットを戻したい(キー名、例えばFOO、BAR)ならどうでしょうか?

Jqは、オブジェクトとキーと値のペアの配列を変換するためにto_entriesfrom_entriesを提供します。 selectの周りのmapと一緒に

これらの関数は、オブジェクトとキーと値のペアの配列間の変換を行います。 to_entriesにオブジェクトが渡されると、入力の各k:vエントリに対して、出力配列に{"key":k、 "value":v}が含まれます。

from_entriesは逆の変換を行い、with_entries(foo)はto_entriesの省略形です。マップ(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"
  }
}
24
spazm