使用jq从多个文件进行匹配和合并

时间:2020-03-12 23:46:56

标签: json jq

我有一个包含“登录” json文件的目录,如下所示:

TVSpec

在另一个目录中,我有一堆这样的“用户” json文件:

[
 {
    "user_id": "5ce722b803b54f03f745cdf45d579920",
    "time": "2019-10-29T20:03:18.894006Z"
  },
  {
    "user_id": "5ce722b858f3e80e6e85aad3113a1665",
    "time": "2019-10-29T20:11:32.4843Z"
  }
]

我要使用jq进行的操作是:

  1. 对于“登录”文件中的每个[ { "id": "5ce722b803b54f03f745cdf45d579920", "email": "foo@gmail.com", "first_name": "John", "last_name": "Doe", "enabled": true, "created_at": "2019-06-13T17:07:17.2925Z", "updated_at": "2019-06-13T17:15:20.903085Z", "groups": { "count": 1, "shortlist": [ { "id": "5d0282c5d5d6063286140e864a0c6506", "name": "cool users", "description": "cool users", "locked": true } ] }, "avatar": "", "role_id": "5d0282c488bba9ebc62df8b3c38571a9", "company_uid": "" }, { "id": "5d0284fdec62d47039e7119013b0aa2c", "email": "bar@gmail.com", "first_name": "Jane", "last_name": "Doe", "enabled": true, "created_at": "2019-06-13T17:16:45.210018Z", "updated_at": "2019-06-13T17:16:45.210018Z", "groups": { "count": 1, "shortlist": [ { "id": "5d0282c5d5d6063286140e864a0c6506", "name": "cool users", "description": "cool users", "locked": true } ] }, "avatar": "", "role_id": "5d0282c488bba9ebc62df8b3c38571a9", "company_uid": "" } ] ,我想在“用户”文件中找到匹配的user_id
  2. 我想将这两个对象合并在一起。

预期结果是另一个json文件,其中包含登录名和相应的用户数据。另外,我只希望电子邮件来自“用户”的名字和姓氏。

最终结果将如下所示:

id

我尝试了以下内容的变体,但最终看起来像是无限循环之类的东西。我知道我的for循环是错误的,只是不确定如何使用多个文件。

[
 {
    "user_id": "5ce722b803b54f03f745cdf45d579920",
    "time": "2019-10-29T20:03:18.894006Z",
    "email": "foo@gmail.com",
    "first_name": "John",
    "last_name": "Doe"
  }
}

1 个答案:

答案 0 :(得分:1)

不需要使用shell循环。也就是说,所有事情都可以使用jq完成。

例如,使用调用:

jq -f users-logins.jq --argfile users users.json logins.json

users-logins.jq包含:

INDEX($users[]; .id) as $udict
| map( if $udict[.user_id] then . + $udict[.user_id] else empty end)
| map( {user_id, time, email, first_name, last_name} )

使用样本输入的输出将是:

[
  {
    "user_id": "5ce722b803b54f03f745cdf45d579920",
    "time": "2019-10-29T20:03:18.894006Z",
    "email": "foo@gmail.com",
    "first_name": "John",
    "last_name": "Doe"
  }
]