我有两个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"} }
....
答案 0 :(得分:1)
是。您可以使用--slurpfile选项,但您的字典已经是单个JSON实体(在您的情况下是JSON对象),因此使用--argfile选项读取字典会更简单。
假设:
merge.jq
; 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"
}
}