Конвертировать JSON в CSV - манипулирование строками (jq, bash, awk, sed и т. Д.) - PullRequest
0 голосов
/ 03 ноября 2018

Мне крайне необходима помощь для сценария, который в основном конвертирует текст JSON в текст CSV в попытке скопировать пользователей из одного пула пользователей AWS Cognito в другой.

Экспорт JSON выглядит следующим образом:

{
    "Users": [
        {
            "Username": "user.name",
            "Attributes": [
                {
                    "Name": "sub",
                    "Value": "some-value"
                },
                {
                    "Name": "email_verified",
                    "Value": "true"
                },
                {
                    "Name": "custom:jobtitle",
                    "Value": Director"
                },
                {
                    "Name": "custom:user_id",
                    "Value": "38"
                },
                {
                    "Name": "email",
                    "Value": "foo.bar@email.com"
                }
            ],
            "UserCreateDate": some-value,
            "UserLastModifiedDate": some-value,
            "Enabled": some-value,
            "UserStatus": "some-value"
        }
        [more lines down here]... 
    ] }

Тогда файл CSV будет содержать следующие строки:

,,,,,,,,,foo.bar@email.com,TRUE,,,,,,FALSE,,,Director,,38,FALSE,foo.bar
[more lines down here]...

Итак, переменные будут такими для JSON:

{
    "Users": [
        {
            "Username": "%USERNAME%",
            "Attributes": [
                {
                    "Name": "sub",
                    "Value": "some-value"
                },
                {
                    "Name": "email_verified",
                    "Value": "true"
                },
                {
                    "Name": "custom:jobtitle",
                    "Value": %JOB_TITLE%"
                },
                {
                    "Name": "custom:user_id",
                    "Value": "%USER_ID%"
                },
                {
                    "Name": "email",
                    "Value": %EMAIL%"
                }
            ],
            "UserCreateDate": some-value,
            "UserLastModifiedDate": some-value,
            "Enabled": some-value,
            "UserStatus": "some-value"
        }
        ...
    ]
}

И вот так для CSV:

,,,,,,,,,%EMAIL%,TRUE,,,,,,FALSE,,,%JOB_TITLE%,,%USER_ID%,FALSE,%USERNAME%

где %EMAIL%, %JOB_TITLE%, %USER_ID% и %USERNAME% - переменные, все остальное должно быть просто строкой.

Ценю вашу помощь в продвинутых парнях.

1 Ответ

0 голосов
/ 03 ноября 2018

Сначала рассмотрим этот фильтр:

.Users[].Attributes
| map(select(.Name | . == "custom:jobtitle" or . == "custom:user_id" or . == "email") )
| from_entries
| [ .email, .["custom:jobtitle"], .["custom:user_id"] ]
| @csv

Используемый здесь прием заключается в использовании from_entries для преобразования массива пар имя / значение в объект с именами в качестве ключей.

Предполагая допустимый ввод JSON вдоль строк, показанных в Q, вызов jq с опцией -r даст:

"foo.bar@email.com","Director","38"

К сожалению, точные требования мне не так понятны, но вы должны быть в состоянии адаптировать вышесказанное в соответствии со своими потребностями.

...