Объединить массив с помощью внутреннего свойства - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть разные языковые файлы, подобные этим:

file1

{
    "Pack": [
        {
            "id": "item1",
            "lang": {
                "en": {
                }
            }
        },
        {
            "id": "item2",
            "lang": {
                "en": {
                }
            }
        }
    ]
}

file2

{
    "Pack": [
        {
            "id": "item1",
            "lang": {
                "sp": {
                }
            }
        }
    ]
}

иМне нужно объединить идентичные идентификаторы по полю lang .Окончательный файл должен выглядеть следующим образом:

{
    "Pack": [
        {
            "id": "item1",
            "lang": {
                "en": {
                },
                "sp": {
                }
            }
        },
        {
            "id": "item2",
            "lang": {
                "en": {
                }
            }
        }
    ]
}

Я думаю, что я должен использовать что-то вроде более сложной команды, но моя отправная точка:

jq -s '{ attributes: map(.attributes[0]) }' file*.json

1 Ответ

0 голосов
/ 25 февраля 2019

Сначала вы захотите прочитать все файлы в качестве входных данных, затем объединить все элементы Pack и объединить их в группы по id, затем взять эти группы и расположить их в соответствии с нужным вам результатом.

$ jq -n '
{Pack: ([inputs.Pack[]] | group_by(.id) | map({id: .[0].id, lang: (map(.lang) | add)}))}
' file*.json

В результате:

{
  "Pack": [
    {
      "id": "item1",
      "lang": {
        "en": {},
        "sp": {}
      }
    },
    {
      "id": "item2",
      "lang": {
        "en": {}
      }
    }
  ]
}
...