Como mesclar arquivos json usando jq ou qualquer ferramenta?

0

Modificando a pergunta para ser mais específica. Haverá 2 arquivos JSON, onde o primeiro terá poucos blocos. E o segundo terá poucos blocos com poucas regras de redirecionamento, como você pode ver

"values": [
            "/businessclass/articles/money.page",
            "/businessclass/articles/1.page",
            "/businessclass/articles/2.page"
          ],

A saída deve ser mesclada de 2 arquivos. Incluindo json File 1 changes e Json 2 updated redirect rules.

Arquivo JSON 1

  [    {
  "name" : "caching",
  "options" : {
    "behavior" : "MAX_AGE",
    "mustRevalidate" : false,
    "ttl" : "10m",
    "defaultTtl" : "30m"
  }
},
      {
        "name": "/businessclass/articles/money.page",
        "children": [],
        "behaviors": [
          {
            "name": "redirect",
            "options": {
              "destinationPathOther": "/businessclass/articles/finance-and-operations.page"
            }
          }
        ],
        "criteria": [
          {
            "name": "path",
            "options": {
              "matchOperator": "MATCHES_ONE_OF",
              "values": [
                "/businessclass/articles/money.page"
              ],
              "matchCaseSensitive": false
            }
          }
        ],
        "criteriaMustSatisfy": "all",
        "comments": ""
      }
]

Arquivo JSON 2

  {
    "name": "/businessclass/articles/money.page",
    "children": [],
    "behaviors": [
      {
        "name": "redirect",
        "options": {
          "destinationPathOther": "/businessclass/articles/finance-and-operations.page"
        }
      }
    ],
    "criteria": [
      {
        "name": "path",
        "options": {
          "matchOperator": "MATCHES_ONE_OF",
          "values": [
            "/businessclass/articles/money.page",
            "/businessclass/articles/1.page",
            "/businessclass/articles/2.page"
          ],
          "matchCaseSensitive": false
        }
      }
    ],
    "criteriaMustSatisfy": "all",
    "comments": ""
  }

Saída esperada

[    {
  "name" : "caching",
  "options" : {
    "behavior" : "MAX_AGE",
    "mustRevalidate" : false,
    "ttl" : "10m",
    "defaultTtl" : "30m"
  }
},
      {
        "name": "/businessclass/articles/money.page",
        "children": [],
        "behaviors": [
          {
            "name": "redirect",
            "options": {
              "destinationPathOther": "/businessclass/articles/finance-and-operations.page"
            }
          }
        ],
        "criteria": [
          {
            "name": "path",
            "options": {
              "matchOperator": "MATCHES_ONE_OF",
              "values": [
                "/businessclass/articles/money.page",
                "/businessclass/articles/1.page",
                "/businessclass/articles/2.page"
              ],
              "matchCaseSensitive": false
            }
          }
        ],
        "criteriaMustSatisfy": "all",
        "comments": ""
      }
]

Bem. A ordem das regras pode ser alterada. E, às vezes, novas regras com novos nomes podem ser adicionadas ao arquivo json como "name": "/businessclass/articles/money.page". Portanto, sejam quais forem as mudanças, é preciso encontrar o delta e precisar mesclar os arquivos de acordo. Ou pode criar um novo arquivo json que também contém alterações mescladas.

    
por user3613331 20.10.2018 / 13:02

1 resposta

0

Se eu entendi sua pergunta corretamente, você só quer dar saída a um array que contém o objeto em cada arquivo. Neste caso, -s já fará isso por você, então você só precisa

jq -s . file1 file2

Se você precisar de transformações adicionais, edite a pergunta e dê um breve resumo do que você precisa (não comparei o resultado esperado linha por linha com a saída real).

Editar

Ainda não tenho certeza da natureza geral da transformação de que você precisa, mas se o formato é exatamente como no exemplo, e tudo que você quer é substituir o campo values no primeiro arquivo pelo conteúdo do arquivo. values no segundo arquivo e mantenha todo o resto, tente

jq -s '.[0][1].criteria[0].options.values=.[1].criteria[0].options.values' file1 file2

Aqui -s retorna os arquivos como uma matriz, então .[0] é o primeiro arquivo e .[1] o segundo arquivo. Em seguida, apenas seleciona caminhos estáticos e atualiza um único campo correspondente em primeiro lugar.

Se a ordem ou o número dos seus objetos for variável, ou se a substituição só acontecer para os objetos correspondentes, por favor atualize a questão.

    
por 21.10.2018 / 09:49

Tags