如何使用jq创建基于对象的列,并在其下列出来自同一数组的其他对象,以便将json转换为csv?

如何使用jq创建基于对象的列,并在其下列出来自同一数组的其他对象,以便将json转换为csv?,json,csv,multiple-columns,jq,Json,Csv,Multiple Columns,Jq,大家好 我是jq的新手,我正试图将它用作将json输出转换为csv的工具 我有以下情况。我想将下面列出的json数据转换成一个格式良好的csv文件,用于json所能提供格式之外的其他编辑和审计过程 我有以下json数据: { "enrollments": [ { "adminContact": { "email": "admin@domain.com", "firstName": "john", "l

大家好

我是jq的新手,我正试图将它用作将json输出转换为csv的工具

我有以下情况。我想将下面列出的json数据转换成一个格式良好的csv文件,用于json所能提供格式之外的其他编辑和审计过程

我有以下json数据:

{
"enrollments": [
    {
        "adminContact": {
            "email": "admin@domain.com",
            "firstName": "john",
            "lastName": "doe",
            "phone": "555-555-5555"
        },
        "certificateType": "third-party",
        "changeManagement": true,
        "csr": {
            "c": "US",
            "cn": "www.column.com",
            "l": "Houston",
            "o": "A Company International Ltd.",
            "ou": "Technology and Operations Services",
            "sans": [
                "example1.com",
                "example2.com",
                "example3.com",
                "example4.com"
            ],
            "st": "Bermingham"
        }
    },
    {
        "adminContact": {
            "email": "admin@domain.com",
            "firstName": "john",
            "lastName": "doe",
            "phone": "555-555-5555"
        },
        "certificateType": "third-party",
        "changeManagement": true,
        "csr": {
            "c": "US",
            "cn": "www.column2.com",
            "l": "Houston",
            "o": "A Company International Ltd.",
            "ou": "Technology and Operations Services",
            "sans": [
                "www.example1.com",
                "www.example2.com",
                "www.example3.com",
                "www.example4.com"
            ],
            "st": "Bermingham"
        },
        "certificateType": "third-party",
        "changeManagement": true,
        "csr": {
            "c": "US",
            "cn": "www.column-other-additional-iterations.com",
            "l": "Houston",
            "o": "A Company International Ltd.",
            "ou": "Technology and Operations Services",
            "sans": [
                "www.example-to-infinite1.com",
                "www.example-to-infinite2.com",
                "www.example-to-infinite3.com",
                "www.example-to-infinite4.com"
            ],
            "st": "Bermingham"
    }
]
}
我的目标是将其转换为以下格式的.csv文件。我希望能够获取任何出现的“cn”及其对应的“SAN”,分别对其进行迭代并创建各自的列:

Common Name      SANS            Common Name      SANS             => iterate
www.column.com   example1.com    www.column2.com  www.example1.com
                 example2.com                     www.example2.com
                 example3.com                     www.example3.com
                 example4.com                     www.example4.com  
到目前为止,我所能做的是:

jq -r '.enrollments[].csr | {cn: .cn, sans: .sans[]}  | [.cn, .sans] |@csv' certs.json > test.csv
它给了我以下输出:

"www.column.com","example1.com"
"www.column.com","example2.com"
"www.column.com","example3.com"
"www.column.com","example4.com"
"www.column2.com","www.example1.com"
"www.column2.com","www.example2.com"
"www.column2.com","www.example3.com"
"www.column2.com","www.example4.com"
...iterate through all records of the same type of data that occurs
jq: error (at <stdin>:51): object ({"adminCont...) is not valid in a csv row
0,1

exit status 5
因此,我能够将“cn”对象链接到“sans”数组

如果上面列出的所需格式不可行,以下输出是否有效

Common Name      SANS
www.column.com   example1.com
www.column.com   example2.com
www.column.com   example3.com
www.column.com   example4.com
www.column2.com  www.example1.com
www.column2.com  www.example2.com
www.column2.com  www.example3.com
www.column2.com  www.example4.com
...iterate through all records of the same type of data that occurs
当我在网上进行研究时,我遇到了一些其他人正在使用的技术,但我还没有找到解决方案

对于列名,我一直在命令中使用它。然而,我试图整合的所有东西似乎都不起作用:

(["Common Name"] + ["SANS"]),
此外,很多帖子都说要使用map函数

jq --raw-output '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'
我得到以下输出:

"www.column.com","example1.com"
"www.column.com","example2.com"
"www.column.com","example3.com"
"www.column.com","example4.com"
"www.column2.com","www.example1.com"
"www.column2.com","www.example2.com"
"www.column2.com","www.example3.com"
"www.column2.com","www.example4.com"
...iterate through all records of the same type of data that occurs
jq: error (at <stdin>:51): object ({"adminCont...) is not valid in a csv row
0,1

exit status 5
我尝试将其替换为以下路径:

.enrollments[].csr
.csr.cn
.csr.sans
在这一点上,我不确定,并决定接触社区。再一次,我对jq还不熟悉,我正在努力寻找联系、关系,并学习这里的逻辑。我愿意接受任何建议、建议和/或是否有更好的方法获取这些信息。我也愿意使用其他方法或最佳实践来代替使用另一种格式的输出

如果类似的帖子已经存在,我提前道歉,因为我在搜索中找不到它。如果是这样,请让我知道,我会按照社区指南编辑或删除此帖子


非常感谢你的帮助。谢谢大家!

请求的格式在几个方面有点奇怪,所以让我们从一个更简单、也许更有用的目标开始——生成更规则的格式:

www.column.com  example1.com    www.column2.com www.example1.com
www.column.com  example2.com    www.column2.com www.example2.com
www.column.com  example3.com    www.column2.com www.example3.com
www.column.com  example4.com    www.column2.com www.example4.com
这可以使用过滤器完成:

[ [.enrollments[0].csr |  {cn, sans: .sans[]} | [.cn, .sans] ],
  [.enrollments[1].csr |  {cn, sans: .sans[]} | [.cn, .sans] ] ]
| transpose
| map(add)
| .[]
| @csv
在除第一行以外的所有行中,将第一列和第三列留空 现在,通过调整上述jq程序,可以轻松获得请求的格式,使其成为:

[ [.enrollments[0].csr |  {cn, sans: .sans[]} | [.cn, .sans] ],
  [.enrollments[1].csr |  {cn, sans: .sans[]} | [.cn, .sans] ] ]
| transpose
| map(add)
| (.[0],
   (.[1:][] | (.[2] = "" | .[0] = "" )))
| @csv
一般方法 上面的第一个程序可以推广为允许“注册”数组任意长,如下所示:

[ .enrollments[]
  | [ .csr |  {cn, sans: .sans[]} | [.cn, .sans] ]]
| transpose
| map(add)
| .[]
| @tsv

这也可以像以前一样进行修改,以清空除第一行之外的所有值。

如果真正的目标是审计和编辑JSON,那么使用jq执行审计和编辑不是更好吗?这太神奇了。真正的快速问题,如果注册数组中有多个对象怎么办?我需要手动给它们全部编号吗?i、 e..enrollments[1…50].csr等。顺便说一句,如果请求的格式有点奇怪,您会推荐一种更合理的格式吗?关于数组,请参阅更新。关于奇怪的格式,我不理解真正的问题,所以在这一点上我没有任何补充。抱歉搞混了,你提到我问的关于所需格式的问题很奇怪,所以我想问你是否有更好的方法来检索我试图获取的编队。我已经按照你的说明更新了问题。我想知道的是,如果有其他相同类型的数据出现,是否有一种方法可以收集所有这些数据。当前,在使用命令时,它会捕获所有cn和SAN,并将它们仅放在[0]和[1]两列中。我原以为使用[0]可以获取所有信息,但它不起作用。