with
以下のサンプルファイルが必要です。
ちなみに、セキュリティ環境で実行されるため、ここに会社コードを貼り付けることができないため、許可されませんが、私の問題はやや似ています。値から特定の文字列を取得する必要があります。助けてください
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters":
{
"batter":
[
{ "id": "1001", "type": "Regular" },
{ "id": "1002", "type": "Chocolate" },
{ "id": "1003", "type": "Blueberry" },
{ "id": "1004", "type": "Devil's Food" }
]
},
"topping":
[
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5005", "type": "Sugar" },
{ "id": "5007", "type": "Powdered Sugar" },
{ "id": "5006", "type": "**Chocolate with Sprinkles**" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
}
答え1
jq -r '.topping[] | select(.id == "5006").type / " " | .[1]' file.json
これはtopping
文字列と同じ配列要素を選択し、ここからキー値を抽出します。次に、値をスペースに分割し、2番目に生成された単語を抽出します。出力され、標準出力にデコードされます。id
5006
type
興味深いと思われる場合は、/ " "
その部分をに置き換えることができます。| split(" ")
これはより明確な目的を持っています。または、| scan("\\S+")
文字列に先頭または末尾の空白が含まれている場合、空白以外の空白文字がある場合、または単語の間に複数の空白文字がある場合は、空白以外の文字のシーケンスを抽出します。
わからない場合どこドキュメントでは、文字列は文字列ですが、文字列type
と同じオブジェクトの値なので、使用できます。id
5006
jq -r '.. | select(.id? == "5006").type / " " | .[1]' file.json
これはすべての値とキーに対して繰り返されるので(非常に非効率的です)、id
valueキーを持つすべての項目を選択します5006
。その後、上記のトップレベルのバリエーションと同じです。
with
質問のデータが与えられると、両方の式は標準出力に単語を生成します。
答え2
キー名などの知っている情報を提供していませんが、切り取りを許可する場合は、最善の推測は次のとおりです。
cat testjq.json | jq -r '.topping[] | select(.id == "5006" )' | grep type | cut -d "\"" -f 4 | cut -d " " -f 2