Как объединить два файла? - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь объединить файлы, используя --argjson, но он выдает

список аргументов слишком длинный

Есть ли другой способ объединить эти файлы?

Пытался использовать --slurpfile, но не может получить желаемый вывод

[
  {
    "path": "1"
  },
  {
    "path": "a/1"
  },
  {
    "path": "a/2"
  }
]
jq --argjson groupInfo "$(jq .data file1.json)" '.records[].version.data+=$groupInfo' file2.json 

Файл 1:

{
    "id": "test",
    "data": [
        {
            "path": "a/1"
        },
        {
            "path": "a/2"
        }
    ],
    "information": {
        "id": "1"
    }
}

Файл 2:

{
  "records": [
    {
      "version": {
        "data": [
            {
                "path": "1"
            }
        ]
      }
    }
  ]
}

Выходной файл:

{
  "records": [
    {
      "version": {
        "data": [
          {
            "path": "1"
          },
          {
            "path": "a/1"
          },
          {
            "path": "a/2"
          }
        ]
      }
    }
  ]
}

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Опции --arg и --argjson предназначены для маленьких бит JSON.Хотя опция --argfile технически устарела, она отлично подходит для вашего подхода:

jq --argfile groupInfo <(jq .data file1.json) '
  .records[].version.data+=$groupInfo' file2.json

Существуют и другие варианты.Например,

jq -s '
  .[0].data as $groupInfo
  | .[1]
  | .records[].version.data+=$groupInfo
' file1.json file2.json

Я дам вам понять, как использовать --slurpfile :-)

0 голосов
/ 28 июля 2019

в качестве альтернативы , та же операция JSON достижима с помощью утилиты Unix на основе проходного пути jtc:

bash $ <file2.json jtc -w'<data>l' -mi file1.json -i[data]
{
   "records": [
      {
         "version": {
            "data": [
               {
                  "path": "1"
               },
               {
                  "path": "a/1"
               },
               {
                  "path": "a/2"
               }
            ]
         }
      }
   ]
}
bash $ 
  • пройти пешком (-w) к точке вставки (в file2.json)
  • источник вставки (file1.json) также пройден, чтобы указать вставляемую примочку (-i[data])
  • -m применено слияние-вставка (т.е. объекты объединяются, а не расширяются)

PS> Раскрытие информации: я создатель jtc- инструмент оболочки cli для операций JSON

...