是否可以使用jq从另一个字典json文件中替换一个json文件中的值?

时间:2017-01-27 14:54:32

标签: json dictionary jq

我有两个json文件,一个包含一个映射键名和一个类型,另一个是一个扁平的json文件。

例如。第一个文件包含这样的内容:

[ { "field": "col1", "type": "int" }, { "field" : "col2", "type" : "string" }]

第二个文件是由换行符分隔的大型jsons对象文件:

{ "col1":123, "col2": "foo"}
{ "col1":123, "col2": "foo"}
...

我可以使用JQ生成这样的输出json:

{ "col1":{ "int" : 123 }, "col2": { "string" : "foo"} }
{ "col1":{ "int" : 123 }, "col2": { "string" : "foo"} }

....

2 个答案:

答案 0 :(得分:1)

是。您可以使用--slurpfile选项,但您的字典已经是单个JSON实体(在您的情况下是JSON对象),因此使用--argfile选项读取字典会更简单。

假设:

  • 您的jq过滤器位于文件中,例如merge.jq;
  • 你的字典在dictionary.json;
  • 您的输入流位于input.json

jq调用如下所示:

jq -f merge.jq --argfile dict dictionary.json input.json

有了上述内容,您当然会将该字典称为merge.jq中的$ dict

(当然你可以在jq命令行上指定过滤器,如果这是你喜欢的那样。)

现在,给你!

答案 1 :(得分:1)

不确定。您可能希望首先以易于使用的格式转换第一个文件:将.type映射到.field属性到对象(用作字典)

reduce .[] as $i ({}; .[$i.field] = $i.type)

然后,您可以浏览第二个文件以使用这些映射来更新值。使用--argfile将第一个文件的内容读入变量。

$ jq --argfile file1 file1.json '
(reduce $file1[] as $i ({}; .[$i.field] = $i.type)) as $map
    | with_entries(.value = { ($map[.key]): .value })
' file2.json

产生:

{
  "col1": {
    "int": 123
  },
  "col2": {
    "string": "foo"
  }
}
{
  "col1": {
    "int": 123
  },
  "col2": {
    "string": "foo"
  }
}