首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在公用密钥上加入jq

在公用密钥上加入jq
EN

Stack Overflow用户
提问于 2021-09-10 14:47:16
回答 1查看 149关注 0票数 4

我对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)

代码语言:javascript
复制
{ "c1":
[
{ "c1id":1, "type":"alpha" },
{ "c1id":2, "type":"beta" }
]
}

第二个输入文件:JSON #2,Array c2 (集合2)

代码语言:javascript
复制
{
"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"}
]
}

预期产出:

代码语言:javascript
复制
{"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中的“类型”才会出现在结果中。我想这意味着这是一个匹配/加入练习--我只是为了清楚地加上它--我希望它能奏效。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-10 17:14:32

下面是使用索引和联接的示例:

代码语言:javascript
复制
jq --compact-output --slurpfile c1 c1.json '
    INDEX(
        $c1[0].c1[];
        .type
    ) as $index |
    JOIN(
        $index;
        .c2[];
        .type;
        reverse|add
    )
' c2.json

索引的第一个参数需要生成一个项目流,这就是为什么我们应用[]从数组中单独获取项的原因。第二个参数选择我们的索引键。

我们使用连接的四个参数版本。第一个参数是索引本身,第二个参数是要连接到索引的对象流,第三个参数从流对象中选择查找键,第四个参数是组装连接对象的表达式。该表达式的输入是由两个项数组组成的流,每个数组如下所示:

代码语言:javascript
复制
[{"c2id":1,"type":"alpha","serial":"DDBB001"},{"c1id":1,"type":"alpha"}]

因为我们只想组合来自对象的所有键和值,所以我们只使用add,但是我们首先使用reverse数组,以便在c2字段之前很好地排列c1字段。最终的结果正如你所希望的:

代码语言:javascript
复制
{"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"}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69134020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档