我有一个包含“登录” json文件的目录,如下所示:
TVSpec
在另一个目录中,我有一堆这样的“用户” json文件:
[
{
"user_id": "5ce722b803b54f03f745cdf45d579920",
"time": "2019-10-29T20:03:18.894006Z"
},
{
"user_id": "5ce722b858f3e80e6e85aad3113a1665",
"time": "2019-10-29T20:11:32.4843Z"
}
]
我要使用jq进行的操作是:
[
{
"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
。预期结果是另一个json文件,其中包含登录名和相应的用户数据。另外,我只希望电子邮件来自“用户”的名字和姓氏。
最终结果将如下所示:
id
我尝试了以下内容的变体,但最终看起来像是无限循环之类的东西。我知道我的for循环是错误的,只是不确定如何使用多个文件。
[
{
"user_id": "5ce722b803b54f03f745cdf45d579920",
"time": "2019-10-29T20:03:18.894006Z",
"email": "foo@gmail.com",
"first_name": "John",
"last_name": "Doe"
}
}
答案 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"
}
]