我有多个 JSON 风格的文本文件需要合并:
{
"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,但是当我通过 to_entries
传递文件以将 "CityN"
更正为 "key":"CityN "
,那么 "Coords"
就更深了,无论如何,我尝试对 to_entries
的结果所做的几乎所有操作都会返回 Cannot带有字符串“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]
]
}
}
但我不知道该怎么做。非常感谢您的帮助。
最佳答案
以下解决方案既不优雅也不健壮,但至少它很简单并且可以轻松增强。它假定每个文件有一个对象,并且使用 -s 选项调用 jq。
# 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 input
可能会更好>,并使用 -n
选项而不是 -s
调用 jq。这种方法的优点之一是它消除了每个文件一个对象的要求。
关于json - 如何在格式不良的 JSON 中对列表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62704574/