JQ:用另一个文件中的相应值替换键

时间:2018-10-25 14:04:50

标签: json jq

我正在尝试将原始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,所以感觉很笨。

感谢您的帮助。

更新

我该如何处理文件2中可能不存在文件1中的键导致“无法使用null(空)作为对象键”的情况?

3 个答案:

答案 0 :(得分:2)

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

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

更改其他密钥和输出文件的--arg k aout_a.json

答案 1 :(得分:2)

如果键“ 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 :(得分:2)

  

我该如何处理文件2中可能不存在文件1中的键导致“无法使用null(空)作为对象键”的情况?

最明显的事情可能是测试对象是否具有密钥:

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