ブロックの他の属性値に基づいて名前値を取得する

ブロックの他の属性値に基づいて名前値を取得する

jqを使用して、 "Media"属性(.session.attributeListの下)に "node7000"文字列を含むブロックの "name"値を取得したいと思います(例では、jsonの最初の配列ブロックが一致します。2つあります)。一致:

"値": "ノード 7000"

"value": "node7000 および node8000"

予想されるjq出力は次のとおりです。

「17200駅」

[{
    "name": "Station 17200",
    "attributes": [{
            "name": "EnableLog",
            "value": "1"
        }, {
            "name": "LogFont",
            "value": "0"
        }, {
            "name": "IdleTimer",
            "value": "30"
        }
    ],
    "session": [{
            "attributeList": [{
                    "name": "Launch",
                    "value": "1"
                }, {
                    "name": "Media",
                    "value": "node7000"
                }
            ]
        }, {
            "attributeList": [{
                    "name": "Group",
                    "value": "1"
                }, {
                    "name": "RMedia",
                    "value": "1"
                }
            ]
        }, {
            "attributeList": [{
                    "name": "Launch",
                    "value": ""
                }, {
                    "name": "Media",
                    "value": "node7000 and node8000"
                }
            ]
        }
    ]
},
{
    "name": "Station 17300",
    "attributes": [{
            "name": "EnableLog",
            "value": "1"
        }, {
            "name": "LogFont",
            "value": "0"
        }, {
            "name": "IdleTimer",
            "value": "30"
        }
    ],
    "session": [{
            "attributeList": [{
                    "name": "Launch",
                    "value": "1"
                }, {
                    "name": "Media",
                    "value": "node6000"
                }
            ]
        }, {
            "attributeList": [{
                    "name": "Group",
                    "value": "1"
                }, {
                    "name": "RMedia",
                    "value": "1"
                }
            ]
        }, {
            "attributeList": [{
                    "name": "Launch",
                    "value": ""
                }, {
                    "name": "Media",
                    "value": "node6001"
                }
            ]
        }
    ]
}]

ベストアンサー1

jq解決策:

jq '.[] | select([.session[].attributeList[] 
                   | .name == "Media" and (.value | contains("node7000"))
                 ] | any ).name' jsonfile
  • .[]- 入力配列のすべての要素(オブジェクト)を繰り返します。
  • select(<condition>)<condition>- この入力が返されると、関数は入力を変更せずtrue、そうでなければ出力を生成しません。
  • contains(element)- フィルタ生成が入力に完全に含まれているtrueかどうかelement
  • anytrue- 配列の要素が次の場合、フィルタはブール値配列を入力として使用します。true

出力:

"Station 17200"

おすすめ記事