将JSON转换为CSV字符串操作(jq、bash、awk、sed等)

将JSON转换为CSV字符串操作(jq、bash、awk、sed等),json,csv,export-to-csv,amazon-cognito,jq,Json,Csv,Export To Csv,Amazon Cognito,Jq,我迫切需要一个脚本来帮助我将JSON文本转换为CSV文本,以便将用户从一个AWS Cognito用户池复制到另一个AWS Cognito用户池 导出JSON如下所示: { "Users": [ { "Username": "user.name", "Attributes": [ { "Name": "sub", "

我迫切需要一个脚本来帮助我将JSON文本转换为CSV文本,以便将用户从一个AWS Cognito用户池复制到另一个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\u TITLE%
%USER\u ID%
%USERNAME%
都是变量,那么其他所有内容都应该是字符串


感谢您对高级助手的帮助。

首先考虑以下过滤器:

.Users[].Attributes
| map(select(.Name | . == "custom:jobtitle" or . == "custom:user_id" or . == "email") )
| from_entries
| [ .email, .["custom:jobtitle"], .["custom:user_id"] ]
| @csv
这里使用的技巧是使用
from_entries
将名称/值对数组转换为以名称为键的对象

假设沿着Q中所示的行进行有效的JSON输入,使用-r选项调用jq将产生:

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

不幸的是,我并不清楚确切的要求,但您应该能够根据自己的需要调整上述内容。

感谢您的脚本,这与我的目标基本一致。以下是我需要的输出:
,,,,,,,,foo。bar@email.com,TRUE,,,,,,,FALSE,,,Director,,38,FALSE,foo.bar
如何向输出中添加固定字符串?以及如何在输出中获得用户名?同时,我正在尝试自己修改脚本。