你好,社区。
我是jq的新手,我想用它作为一个工具,将json输出隐藏到csv中。
我有以下的情况。 我想把下面列出的json数据隐蔽到一个格式很好的csv文件中,以便在json所能提供的格式之外进行其他编辑和审计过程。
我有以下的json数据。
{
"enrollments": [
{
"adminContact": {
"email": "[email protected]",
"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": "[email protected]",
"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
所以,我能够将 "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"]),
另外,很多帖子都说要用地图功能,
jq --raw-output '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'
但我得到了以下输出。
jq: error (at <stdin>:51): object ({"adminCont...) is not valid in a csv row
0,1
exit status 5
看起来像是卡在了第一个对象上 我不确定"{"是否是编程出错的地方 但我尝试了下面的方法: 我试着用不同的路径替换"^"所在的区域,希望让程序找到我要找的东西。
jq --raw-output '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows |
^ ^ ^
$cols, $rows[] | @csv'
我试着用下面的路径来代替它,分别是:
.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
这也可以像以前一样修改,以使除第一行以外的所有数值都是空白的。