jq valor de impressão de um elemento em que uma matriz de chaves está vazia ou uma chave está ausente

1
{
    "vehicle": [
        {
            "type": "car",
            "features": [
                {
                    "airbags": "yes",
                    "engine": [
                        {
                            "electric": "yes",
                            "horsepower": "1000"
                        }
                    ],
                    "number": "ABCD 1234"
                }
            ],
            "price": "100000"
        },
        {
            "type": "truck",
            "features": [],
            "price": "500000"
        },
        {
            "type": "train",
            "features": [
                {
                    "airbags": "no",
                    "engine": [
                        {
                            "horsepower": "10000"
                        }
                    ],
                    "number": "MNOPQRST"
                }
            ],
            "price": "100000"
        }
    ]
}

Usando jq ou jmespath , quero o valor de type , em que vehicle[].features[] é uma matriz vazia ou está faltando vehicle[].features[].engine[].electric element.

Portanto, este json deve me listar truck e train , pois o caminhão tem uma matriz vazia vehicle[].features[] e o trem está faltando vehicle[].features[].engine[].electric element.

    
por GypsyCosmonaut 01.09.2018 / 14:36

1 resposta

1

Dada sua entrada específica, onde parece que features e engines têm sempre no máximo um elemento, você deve ser capaz de fazer:

jq -r '.vehicle[] | select(.features[0].engine[0].electric != "yes").type'

Ou:

jq -r '.vehicle[] | select(.features[0].engine[0] | has("electric") | not).type'

para o type desses vehicle s cujo primeiro engine do primeiro features tem not obteve uma electric .

Ou se, como eu, você conhece perl ou outra linguagem de programação e prefere não aprender outra (e muito específica) como jq s:

perl -MJSON -l -0777 -ne '
  $j = from_json($_);
  for (@{$j->{vehicle}}) {
    print $_->{type} unless $_->{features}[0]->{engine}[0]->{electric} eq "yes"
  }' < file.js

(ou unless defined($_->{features}[0]->{engine}[0]->{electric}) ).

    
por 01.09.2018 / 15:11

Tags