obtém valores de nome baseando-se em um valor de outro atributo no bloco

1

com jq, gostaria de obter o valor "name" dos blocos onde o atributo "Media" (sob .session.attributeList) contém a string "node7000" (no exemplo o primeiro bloco do array json corresponde a ele - há dois correspondentes:

"value": "node7000"

"value": "node7000 e node8000"

e a saída jq esperada seria:

"Estação 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"
                }
            ]
        }
    ]
}]
    
por DonJ 16.01.2018 / 14:04

1 resposta

2

jq solução:

jq '.[] | select([.session[].attributeList[] 
                   | .name == "Media" and (.value | contains("node7000"))
                 ] | any ).name' jsonfile
  • .[] - iterando sobre todos os elementos (objetos) da matriz de entrada
  • select(<condition>) - a função produz sua entrada inalterada se <condition> retornar true para essa entrada e não produzir saída, caso contrário
  • contains(element) - o filtro produz true se element estiver completamente contido na entrada
  • any - o filtro recebe como entrada uma matriz de valores booleanos e produz true como saída se algum dos elementos da matriz for true

A saída:

"Station 17200"
    
por 16.01.2018 / 14:27

Tags