【问题标题】:JQ: Replace keys with corresponding value in another fileJQ:用另一个文件中的相应值替换键
【发布时间】:2018-10-25 14:04:49
【问题描述】:

我正在尝试将原始 JSON 中的键值替换为另一个文档中具有相应键的对象的值。

这是我的两个文件: 文件 1:

{
    "-KaM0otlgWxXniYiacFe": {
        "-LNxx1IiX6oYTxJ4IXx2": true
    },
    "-KlJTvbfonIMI_-YfS5R": {
        "-LNxx1IbaB-yrZ623hrX": true
    }
}

文件 2:

{
    "-KaM0otlgWxXniYiacFe": {
        "a": "-L-b__nH9PlMcz0stDDE",
        "b": "-L7ZNKSZy570TlrQUzHM",
        "c": "-Kaae3MsQUyViCKPs8Iv"
    },
    "-KlJTvbfonIMI_-YfS5R": {
        "a": "-LAlXKfUUTdYDeCZH-u-",
        "b": "-L7ZNKSTnob7w0HXjHr6",
    "    c": "-KYYicPD7VA9DEF_rus3"
    }
}

目标是创建 3 个新文件,其中原始键已替换为每个文件中的 a、b 和 c 的值。

查看“a”时的期望结果:

{
    "-L-b__nH9PlMcz0stDDE": {
        "-LNxx1IiX6oYTxJ4IXx2": true
    },
    "-LAlXKfUUTdYDeCZH-u-": {
        "-LNxx1IbaB-yrZ623hrX": true
    }
}

我尝试过使用类似的东西:

cat file1.json | jq --slurpfile file2 file2.json '| map(with_entries(.key = .file2[.key].a'

但是我之前没有使用过jq,所以我感觉很无能。

感谢任何帮助。

更新:

文件1中的key可能不存在于文件2中,导致“Cannot use null (null) as object key”的情况如何处理?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    如果您有多个键“a”、“b”、...,并且如果您不介意输出文件是否被缩小,您可以使用该方法避免多次调用 jq此处说明:

    < file1.json jq -rc --argjson keys '["a", "b", "c"]' --argfile file2 <(file2) '
      $keys[] as $k 
      | ($k, (with_entries(.key |= $file2[.][$k]) ))
    ' | awk 'file {print > file ".json"; file=0; next} {file=$0}'
    

    您可以更进一步,使用(例如)以编程方式计算 $keys

       [$file2[]][0]|keys_unsorted
    

    【讨论】:

      【解决方案2】:

      文件1中的key可能不存在于文件2中,导致“Cannot use null (null) as object key”的情况如何处理?

      最明显的做法可能是测试对象是否有密钥:

      with_entries(.key |= (if $file2[.]|has($k) then $file2[.][$k]  else . end))
      

      【讨论】:

        【解决方案3】:

        不是 jq 方面的专家,但这是我想出的:

        jq --arg k a --argfile file2 file2.json 'with_entries(.key |= $file2[.][$k])' file1.json > out_a.json
        

        --arg k aout_a.json 更改为其他键和输出文件。

        【讨论】:

        • jq 过滤器可以简化为:'with_entries(.key |= $file2[.][$k])'
        • 感谢您的解决方案。我该如何处理密钥可能不存在、在 File2 中为 null 的情况?
        • 嗯,我不知道。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-12
        • 1970-01-01
        • 2018-09-14
        • 2023-02-05
        • 2019-10-27
        相关资源
        最近更新 更多