Совпадение и объединение из нескольких файлов с JQ - PullRequest
0 голосов
/ 13 марта 2020

У меня есть каталог с кучей «логинов» json таких файлов:

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

В другом каталоге у меня есть куча «пользователей» json файлов вроде этого:

[
  {
    "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": ""
  }
]

Что я пытаюсь сделать с помощью jq:

  1. Для каждого user_id в файлах "Logins" я хочу найти соответствующий id в Файлы «Users».
  2. Я хочу объединить эти два объекта.

Предполагаемый результат - другой файл json, который содержит логин и соответствующие данные пользователя. В качестве бонуса, я хочу только имя и фамилию электронной почты от «Пользователи».

Конечный результат будет примерно таким:

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

Я пробовал варианты ниже, но в итоге получится бесконечное l oop или что-то в этом роде. Я знаю, что мои циклы for неправильны, но я не знаю, как работать с несколькими файлами, подобными этим.

lastlogins="/last10/*.json"
users="/users/*.json"
for ll in $lastlogins; do
  for user in $users; do
    userid=$(jq -r '.[].user_id' $ll)
    jq -c --arg userid "$userid" '.[] | select(.id == $userid)' $user
  done
done

1 Ответ

1 голос
/ 13 марта 2020

Нет необходимости использовать зацикливание оболочки. То есть все можно сделать, используя 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"
  }
]
...