如何将文件夹组织的.json文件合并为一个JSON文件,文件夹/文件名作为键

bqujaahr  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(103)

我有一个文件夹树,其中存储了从数据集转换而来的各种.json文件。

/(top folder)
 |-- folder1/
 |    |- file1.json {"a":1,"b":[1,2]}
 |    |- file2.json {"a":12,"c":[]}
 |-- folder2/
      |- file1.json {"ta":1,"tb":[1,2]}
      |- file2.json {"ta":12,"tc":1}
      |- folder21/
          |- file3.json {"test":true}

字符串
我希望将此文件夹合并为

{
   "folder1": {
      "file1.json": {"a":1,"b":[1,2]},
      "file2.json": {"a":12,"c":[]}
   },
   "folder2": {
      "file1.json": {"ta":1,"tb":[1,2]},
      "file2.json": {"ta":12,"tc":1},
      "folder21" : {
        "file3.json": {"test":true}
      }
   }
}


我知道这可以用python/perl通过编写显式循环来实现:1)解析json文件,2)使用文件/文件夹名称作为键将解析的数据与本机数据结构/对象合并,3)将合并的数据结构保存到单个JSON文件中。我有implemented one for Octave/MATLAB,它可以工作,但有点慢。
我想知道是否有可能使用jq有效地做到这一点。
我看到可以使用reduce表达式合并同一文件夹中的json文件,请参阅https://stackoverflow.com/a/59769797/4271392
我想知道jq是否允许扫描和重命名子文件夹,并通过每个文件夹合并。
如果这是可能的,我将不胜感激,如果有人可以给我指出相关的例子或文档。

ecbunoof

ecbunoof1#

当你在评论区提到bash时,你可以尝试调用jq:

#!/bin/bash

shopt -s globstar
jq -n 'reduce inputs as $s ({}; setpath(input_filename|split("/");$s) )' */**/*.json

字符串
我的测试输出:

{
  "folder1": {
    "file1.json": {
      "a": 1,
      "b": [
        1,
        2
      ]
    }
  },
  "folder2": {
    "folder21": {
      "file3.json": {
        "test": true
      }
    }
  }
}

相关问题