【问题标题】:Parse 2 files based on key value and recreate another json file [JQ]根据键值解析 2 个文件并重新创建另一个 json 文件 [JQ]
【发布时间】:2021-10-30 12:51:08
【问题描述】:

我是 JQ 的新手。 我需要基于另外 2 个文件制作一个 json 文件。 我整天都在使用它并在这里堆叠。非常需要这个。

这是文件 1

{
"name": "foo",
  "key": "1",
  "id": "x"
}
{
  "name": "bar",
  "key": "2",
  "id": "x"
}
{
  "name": "baz",
  "key": "3",
  "id": "y"
}

文件 2

{
"name": "a",
  "key": "1"
}
{
  "name": "b",
  "key": "1"
}
{
  "name": "c",
  "key": "2"
}
{
  "name": "d",
  "key": "2"
}
{
  "name": "e",
  "key": "3"
}

预期结果:

{
"x": {
    "foo": [
      "a",
      "b"
    ],
    "bar": [
      "c",
      "d"
    ]
  },
  "y": {
    "baz": [
      "e"
    ]
  }
}

我可以用 python 脚本来做,但我需要用 jq。

提前致谢。

【问题讨论】:

    标签: json bash jq


    【解决方案1】:

    在第一个文件的项目 ($i) 上使用 reduce 以使用 setpath 连续构建结果对象,其中项目和值的字段作为辅助字典文件 ($d) 上的匹配映射。

    jq -s --slurpfile d file2 '
      reduce .[] as $i ({}; setpath(
        [$i.id, $i.name];
        [$d[] | select(.key == $i.key).name]
      ))
    ' file1
    

    【讨论】:

      【解决方案2】:

      为了提高效率,下面的方案首先基于file2构造一个“字典”;此外,它不必“啜饮”它。

      < file2 jq -nc --slurpfile file1 file1 '
        (reduce inputs as {$name, $key} ({};
            .[$key] += [$name])) as $dict
        | reduce $file1[] as {$name, $key, $id} ({};
            .[$id] += [ {($name): $dict[$key]} ] )
      '
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多