如何在格式不佳的JSON中对列表进行分组
我有多个JSON ish文本文件需要合并:如何在格式不佳的JSON中对列表进行分组,json,merge,jq,Json,Merge,Jq,我有多个JSON ish文本文件需要合并: { "City1": { "Coords": [ [10,20,30], [11,21,31] ] }, "City2": { "Coords": [ [12,22,32] ] } } { "City1": { "Coor
{
"City1":
{
"Coords":
[
[10,20,30],
[11,21,31]
]
},
"City2":
{
"Coords":
[
[12,22,32]
]
}
}
{
"City1":
{
"Coords":
[
[13,23,33]
]
},
"City3":
{
"Coords":
[
[14,24,34],
[15,25,35]
]
}
}
City1
,City2
等可以扩展到几十个,每个都有不同数量的坐标
我知道这些文件不是正确的JSON,但是,当我通过传递文件到_条目
以更正“CityN”
到“key”:“CityN”
,那么“Coords”
是一个更深的层次,在任何情况下,我尝试对to\u条目的结果执行的几乎所有操作都返回无法使用字符串“key”
索引数组
我想回去
{
"City1":
{
"Coords":
[
[10,20,30],
[11,21,31],
[13,23,33]
]
},
"City2":
{
"Coords":
[
[12,22,32]
]
},
"City3":
{
"Coords":
[
[14,24,34],
[15,25,35]
]
}
}
但是我不知道怎么做。非常感谢您的帮助。下面的解决方案既不优雅也不健壮,但至少它很简单,可以很容易地进行健壮化。它假定每个文件有一个对象,并且jq是通过-s选项调用的
# merge two same-key objects with array-valued keys
# by concatenating the arrays
def merge($b):
if . == null or . == {} then $b
else reduce (keys_unsorted[]) as $key (.;
.[$key] += ($b[$key]) )
end;
reduce .[] as $cities (null;
reduce ($cities|keys_unsorted[]) as $city (.;
.[$city] |= merge($cities[$city]) ))
如果jq有输入
(可能是这样),那么最好将reduce.
更改为reduce输入
,并使用-n
选项而不是-s
调用jq。这种方法的一个优点是,它删除了每个文件一个对象的要求。以下方法有效:
jq -s 'map(to_entries)|flatten|group_by(.key)|
map( { (.[0].key): { "Coords": (reduce .[].value.Coords as $i ([]; . + $i))}} )'
为了jq
的目的,您的输入是一个正确的JSON对象流jq
可以处理这种输入。我使用-s
选项将流转换为JSON数组。将reduce.[]
更改为reduce输入,并作为jq-nf merge.jq…