我希望将两个不同的 JSON 文件合并到一个文件中 -
文件1
[
{
"namespace": "lerjr-rb26-sandbox-keycloak",
"name": "keycloak",
"url": "REMOVED"
},
{
"namespace": "prometheus-brr1-sandbox",
"name": "abacus",
"url": "REMOVED"
},
{
"namespace": "prometheus-brr1-sandbox",
"name": "keycloak",
"url": "REMOVED"
},
{
"namespace": "prometheus-nginxredirect-sandbox",
"name": "riskpoynt-redirect444",
"url": "REMOVED"
},
{
"namespace": "prometheus-nginxredirect-sandbox",
"name": "riskpoynt-redirect447",
"url": "REMOVED"
},
{
"namespace": "prometheus-x105-sandbox",
"name": "epas",
"url": "REMOVED"
},
{
"namespace": "prometheus-x105-sandbox",
"name": "epas-oidc",
"url": "REMOVED"
},
{
"namespace": "prometheus-x105-sandbox",
"name": "keycloak",
"url": "REMOVED"
}
]
文件2
[
{
"namespace": "ler-rb26-sandbox",
"labels": {
"pg.customerName": "prometheus",
"pg.customerCode": "rb26",
"pg.product": "keycloak",
"pg.environment": null
}
},
{
"namespace": "lerjr-rb26-sandbox-keycloak",
"labels": {
"pg.customerName": "lerjr",
"pg.customerCode": "rb26",
"pg.product": "keycloak",
"pg.environment": null
}
},
{
"namespace": "prometheus-brr1-sandbox",
"labels": {
"pg.customerName": "prometheus",
"pg.customerCode": null,
"pg.product": null,
"pg.environment": null
}
}
]
预期产出
[
{
"namespace": "lerjr-rb26-sandbox-keycloak",
"labels": {
"pg.customerName": "lerjr",
"pg.customerCode": "rb26",
"pg.product": "keycloak",
"pg.environment": null
},
"ingresses": [
{
"name": "keycloak",
"url": "REMOVED"
}
]
},
{
"namespace": "prometheus-brr1-sandbox",
"labels": {
"pg.customerName": "prometheus",
"pg.customerCode": null,
"pg.product": null,
"pg.environment": null
},
"ingresses": [
{
"name": "abacus",
"url": "REMOVED"
},
{
"name": "keycloak",
"url": "REMOVED"
}
]
},
{
"namespace": "prometheus-nginxredirect-sandbox",
"labels": {
"pg.customerName": "null",
"pg.customerCode": null,
"pg.product": null,
"pg.environment": null
},
"ingresses": [
{
"name": "riskpoynt-redirect444",
"url": "REMOVED"
},
{
"name": "riskpoynt-redirect447",
"url": "REMOVED"
}
]
},
{
"namespace": "prometheus-x105-sandbox",
"labels": {
"pg.customerName": "null",
"pg.customerCode": null,
"pg.product": null,
"pg.environment": null
},
"ingresses": [
{
"name": "epas",
"url": "REMOVED"
},
{
"name": "epas-oidc",
"url": "REMOVED"
},
{
"name": "keycloak",
"url": "REMOVED"
}
]
}
]
请注意,最终产品具有标签(如果不存在则为 null),并且如果没有入口,则删除名称空间条目。命名空间键/值对是两个文件之间的链接 - 我想文件 1 是主文件,如果文件 1 中没有命名空间条目,我不希望文件 2 中的命名空间条目。
任何和所有的帮助将不胜感激,我一直在努力解决这个问题。
首先将“文件 2”文件传递给以下表达式,然后将“文件 1”文件传递给以下表达式,我们使用SQL 样式运算符
jq
在两个之间执行关系 LEFT JOIN 操作。jq
该
JOIN()
函数需要一个为左连接数据集计算的索引、一个表示我们要连接的数据集条目的对象数据流、一个从我们要连接的元素中挑选出键的表达式,以及一个表达式从连接对创建结果对象。该
INDEX()
函数作用于“文件 2”文件,将根据该键创建索引namespace
。其输出如下(请注意这些namespace
值现在如何用作键):我们将来自另一个文件的传入数据分组到
namespace
键上,这为我们提供了一个数组,其中每个元素都是具有相同值的对象数组namespace
。第一个此类对象的值namespace
用作连接键。该函数的最后一部分
JOIN()
是一个表达式,它组合了一对对象,一个来自第一个文件,一个来自第二个文件,并按namespace
值进行匹配。如果存在标签,则从“文件 2”中选取标签,否则null
将插入 -value 标签。你可以使用以下命令来运行它
...它会输出以下内容:
请注意,这些是松散对象,不属于数组的一部分。如果您希望将它们收集在数组中,请将整个
jq
表达式放入 中[...]
,或者将输出传递给jq -s .
。