我对jq非常陌生,这篇文章是由于不了解jq背后的机制而造成的。我可以开发一个bash脚本,它可以做我想做的事情,但是jq和它的JSON超级能力已经引起了我的兴趣,我想通过应用到现实世界的场景来学习它。这里有一个..。
顺便说一句,我尝试过使用与jq相关的现有解决方案来合并/加入JSON,但是失败了。
最接近我需要的是使用索引和$x +的连接。然而,我只是从我的第二个(c2) json中得到了最后一个项目。
因此,我的问题是:
有两个JSON文件:
JSON #1将具有唯一的"id“和"type”键--以及其他键/值对,为了更清楚地说明我的帖子,我删除了这些键/值对。JSON #2将包含多个/非唯一的"type“键,我想将其与这两个JSON文件匹配。此JSON #2还将包含其他键/值对,这些键/值对预期将包含在结果输出中。我的输出要求是:我希望获得一个(每一行一个或一个数组)列表,其中包含c1和c2数组之间所有匹配键/值对的组合,其中“类型”键(string)的值与c1和c2之间的值完全匹配。
还有一个问题,如果要在三个JSON文件之间执行类似的匹配/连接(同样是在特定键的值上),那么扩展解决方案会有多大的困难呢?
任何帮助,甚至只是暗示如何解决和理解如何解决这一问题,将不胜感激!
第一个输入文件:JSON #1,Array c1 (集合1)
{ "c1":
[
{ "c1id":1, "type":"alpha" },
{ "c1id":2, "type":"beta" }
]
}第二个输入文件:JSON #2,Array c2 (集合2)
{
"c2":
[
{ "c2id":1,"type":"alpha","serial":"DDBB001"} ,
{ "c2id":2,"type":"beta","serial":"DDBB007"} ,
{ "c2id":3,"type":"alpha","serial":"DDTT005"} ,
{ "c2id":4,"type":"beta","serial":"DDAA002"} ,
{ "c2id":5,"type":"yotta","serial":"DDCC017"}
]
}预期产出:
{"c1id":1,"type":"alpha","c2id":1,"serial":"DDBB001"}
{"c1id":1,"type":"alpha","c2id":3,"serial":"DDTT005"}
{"c1id":2,"type":"beta","c2id":2,"serial":"DDBB007"}
{"c1id":2,"type":"beta","c2id":4,"serial":"DDAA002"} 您将注意到输出中不包含来自c2的"yotta“类型。这是意料之中的。只有存在于c1和匹配c2中的“类型”才会出现在结果中。我想这意味着这是一个匹配/加入练习--我只是为了清楚地加上它--我希望它能奏效。
发布于 2021-09-10 17:14:32
下面是使用索引和联接的示例:
jq --compact-output --slurpfile c1 c1.json '
INDEX(
$c1[0].c1[];
.type
) as $index |
JOIN(
$index;
.c2[];
.type;
reverse|add
)
' c2.json索引的第一个参数需要生成一个项目流,这就是为什么我们应用[]从数组中单独获取项的原因。第二个参数选择我们的索引键。
我们使用连接的四个参数版本。第一个参数是索引本身,第二个参数是要连接到索引的对象流,第三个参数从流对象中选择查找键,第四个参数是组装连接对象的表达式。该表达式的输入是由两个项数组组成的流,每个数组如下所示:
[{"c2id":1,"type":"alpha","serial":"DDBB001"},{"c1id":1,"type":"alpha"}]因为我们只想组合来自对象的所有键和值,所以我们只使用add,但是我们首先使用reverse数组,以便在c2字段之前很好地排列c1字段。最终的结果正如你所希望的:
{"c1id":1,"type":"alpha","c2id":1,"serial":"DDBB001"}
{"c1id":2,"type":"beta","c2id":2,"serial":"DDBB007"}
{"c1id":1,"type":"alpha","c2id":3,"serial":"DDTT005"}
{"c1id":2,"type":"beta","c2id":4,"serial":"DDAA002"}https://stackoverflow.com/questions/69134020
复制相似问题