web-dev-qa-db-ja.com

jq:ネストされたオブジェクト、トップレベルIDを抽出し、内部オブジェクトから値を持ち上げます

次の場合のxample.json;

[
 {
  "id": 12345678,
  "stuff": { "book": "shelf", "hook": "line", "took": "off", "info-spec": 12 },
  "votes": 23
 },
 {
  "id": 12345679,
  "stuff": { "book": "maker", "hook": "sinker", "took": "pisin", "info-spec": 23 },
  "votes": 1
 }
]

idvotesは簡単に抽出できます:

$ jq '.[] | { id, votes }' xample.json
{
  "votes": 23,
  "id": 12345678
}
{
  "votes": 1,
  "id": 12345679
}

しかし、idstuff.info-specを抽出するクエリはどのように見えるでしょうか? (私にとって)明白な構文はまったく機能しません。

$ jq '.[] | { id, stuff.info-spec }' xample.json
error: syntax error, unexpected '.', expecting '}'
.[] | { id, stuff.info-spec }
                 ^
1 compile error

私はstuff[info-spec]stuff["info-spec"]も試してみましたが、どうすればよいかわからないようです。

キー名のダッシュは問題をさらに複雑にするように見えますが、私の理解は限られており、二重引用符でそれを回避することができます。

$ sed 's/votes/vo-tes/g' xample.json | jq '.[] | { id, "vo-tes" }'

期待される出力を提供します(つまり、 "vo-tes"にダッシュなしの上記と同様)。

bookを抽出できます:

$ jq '.[] | .stuff.book' xample.json

ただし、idbookの構文はわかりません。しかし、同じ構文でinfo-specを抽出することもできません。

$ jq '.[] | .stuff."info-spec"' xample.json
error: syntax error, unexpected QQSTRING_START, expecting IDENT
.[] | .stuff."info-spec"
             ^
1 compile error

引用符を外した場合、エラーメッセージは(予想通り)異なります。

$ jq '.[] | .stuff.info-spec' xample.json
error: spec is not defined
.[] | .stuff.info-spec
                  ^^^^
1 compile error

しかし、ちょっと、これはうまくいきます:

$ jq '.[] | .stuff["info-spec"] ' xample.json
12
23

したがって、この例で必要な出力は

{
  "info-spec": 12,
  "id": 12345678
}
{
  "info-spec": 23,
  "id": 12345679
}

[〜#〜] faq [〜#〜]jq Cookbook を見てきましたが、何も見つからないようです別のオブジェクト内のオブジェクト内からアイテムを「持ち上げる」ための構文。

20
tripleee

私はそれを理解することができた。

$ jq '.[] | { id, "info-spec": .stuff["info-spec"] }' xample.json
{
  "info-spec": 12,
  "id": 12345678
}
{
  "info-spec": 23,
  "id": 12345679
}

ここで重要なのは、newkey: .complex["key"]リフトの表記。

6
tripleee

興味深いことに、問題は確かに「-」文字であり、これは私にとってはうまくいきます:

jq '.[] | { id, "info-spec": .stuff."info-spec" }' xample.json
{
  "id": 12345678,
  "info-spec": 12
}
{
  "id": 12345679,
  "info-spec": 23
}

まだあなたのjqは次のように壊れて私のものはそうではないので、その構文が好きではないようです:

jq '.[] | .stuff."info-spec"' xample.json
12
23

私が使う:

jq --version
jq-1.4

編集:<1.4のバージョンの問題のようです: https://github.com/stedolan/jq/issues/38

14
Hans Z.