如何合并两个文件?

时间:2019-07-10 15:46:33

标签: json file merge jq

我正在尝试使用--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 个答案:

答案 0 :(得分:1)

--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 :-)

答案 1 :(得分:0)

或者,使用基于步行路径的unix实用程序 jtc 可以实现相同的JSON操作:

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应用了 merge-insert (即对象被合并而不是被扩展)

PS>披露:我是jtc-用于JSON操作的shell cli工具的创建者