jqを使用してjsonデータから特定の文字列を取得する

jqを使用してjsonデータから特定の文字列を取得する

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番目に生成された単語を抽出します。出力され、標準出力にデコードされます。id5006type

興味深いと思われる場合は、/ " "その部分をに置き換えることができます。| split(" ")これはより明確な目的を持っています。または、| scan("\\S+")文字列に先頭または末尾の空白が含まれている場合、空白以外の空白文字がある場合、または単語の間に複数の空白文字がある場合は、空白以外の文字のシーケンスを抽出します。

わからない場合どこドキュメントでは、文字列は文字列ですが、文字列typeと同じオブジェクトの値なので、使用できます。id5006

jq -r '.. | select(.id? == "5006").type / " " | .[1]' file.json

これはすべての値とキーに対して繰り返されるので(非常に非効率的です)、idvalueキーを持つすべての項目を選択します5006。その後、上記のトップレベルのバリエーションと同じです。

with質問のデータが与えられると、両方の式は標準出力に単語を生成します。

答え2

キー名などの知っている情報を提供していませんが、切り取りを許可する場合は、最善の推測は次のとおりです。

cat testjq.json | jq -r '.topping[] | select(.id == "5006" )' | grep type | cut -d "\"" -f 4 | cut -d " " -f 2

関連情報