jq filter: mostra toda a estrutura com seleção

0

Eu tenho o seguinte arquivo json:

{
  "name": "eye",
  "attributes": [
    {
      "name": "Width",
      "value": "1920"
    },
    {
      "name": "Height",
      "value": "1080"
    },
    {
      "name": "WinKeyMapping",
      "value": "leftwin"
    }
  ],
  "starts": [
    {
      "name": "step1",
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        },
        {
          "name": "Test",
          "value": "none"
        }
      ]
    }
  ]
}

e o seguinte filtro:

$ jq '.starts[].attributeList[]|select(.name=="Command")' file1
{
  "name": "Command",
  "value": "bash"
}
$

como eu poderia obter toda a estrutura para essa seleção?

resultado esperado:

{
  "starts": [
    {
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        }
      ]
    }
  ]
}
    
por DonJ 09.03.2018 / 22:27

2 respostas

1

Diretamente com jq :

jq '{ starts: [ { attributeList: (.starts[].attributeList 
                                  | map(select(.name == "Command"))) }] }' file.json

A saída:

{
  "starts": [
    {
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        }
      ]
    }
  ]
}
    
por 09.03.2018 / 22:43
0

Aqui estão duas opções para obter o resultado desejado.

Você pode excluir as chaves que não deseja:

jq 'del(.attributes, .name) | 
  .starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'

Ou você pode selecionar apenas a (s) chave (s) que deseja:

jq 'to_entries | map(select(.key == "starts")) | from_entries | 
  .starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'

Ambos fornecem o mesmo resultado. Além disso, se você quiser starts e ends no último caso, basta adicionar mais or declarações: map(select((.key == "starts") or (.key == "ends"))) .

    
por 12.04.2018 / 15:48

Tags