次の場合の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
}
]
id
とvotes
は簡単に抽出できます:
$ jq '.[] | { id, votes }' xample.json
{
"votes": 23,
"id": 12345678
}
{
"votes": 1,
"id": 12345679
}
しかし、id
とstuff.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
ただし、id
とbook
の構文はわかりません。しかし、同じ構文で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 を見てきましたが、何も見つからないようです別のオブジェクト内のオブジェクト内からアイテムを「持ち上げる」ための構文。
私はそれを理解することができた。
$ jq '.[] | { id, "info-spec": .stuff["info-spec"] }' xample.json
{
"info-spec": 12,
"id": 12345678
}
{
"info-spec": 23,
"id": 12345679
}
ここで重要なのは、newkey: .complex["key"]
リフトの表記。
興味深いことに、問題は確かに「-」文字であり、これは私にとってはうまくいきます:
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