【问题标题】:jq merge two json files and create a key as the filename for each in merged filejq 合并两个 json 文件并创建一个键作为合并文件中每个文件的文件名
【发布时间】:2020-01-16 11:17:54
【问题描述】:

问题

如何使用 jq 合并多个 JSON 文件。每个合并的对象在最终合并的文件中必须有自己的键名。

file1.json

{
  "shoe": 0,
  "temp": "10"
}

file2.json

{
  "num": {
    "sock": 0,
    "ratio": {
      "cat": 100,
      "dog": 0
    }
  },
  "hair": "blue"
}

所需的合并输出

{
  "file1": {
    "shoe": 0,
    "temp": "10"
  },
  "file2": {
    "num": {
      "sock": 0,
      "ratio": {
        "cat": 100,
        "dog": 0
      }
    },
    "hair": "blue"
  }
}

尝试 1: 下面的问题是,如果有意义的话,对象层次结构会被合并:

jq --slurp 'add' file1.json file2.json

尝试 1 输出(不是我想要的)

{
  "shoe": 0,
  "temp": "10"
  "num": {
    "sock": 0,
    "ratio": {
      "cat": 100,
      "dog": 0
    }
  },
  "hair": "blue"
}

【问题讨论】:

    标签: json jq


    【解决方案1】:

    jq 有一个内置变量input_filename,它表示正在应用过滤器的文件名。所以你可以做类似的事情

    jq -n 'reduce inputs as $s (.; .[input_filename] += $s)'  file1.json file2.json
    

    reduce 表达式采用整个输入对象并以键作为正在使用的文件名构造最终的 JSON。

    您可以更进一步,并希望有选择地删除 JSON .json 的扩展部分,使用可用的修剪功能。下面的代码假定输入文件以.json 结尾,并且不能与任何其他扩展一起使用

    jq -n 'reduce inputs as $s (.; (.[input_filename|rtrimstr(".json")]) += $s)'
    

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      相关资源
      最近更新 更多