【发布时间】:2020-05-17 23:54:48
【问题描述】:
晚安社区,
我是 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
所以,我能够将“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 的新手,我正在尝试在这里找到联系、关系并学习逻辑。我愿意接受任何建议、意见和/或是否有更好的方法来获取这些信息。我也对使用其他格式输出的其他方法或最佳实践持开放态度。
如果已经存在类似的帖子,我提前道歉,因为我无法在搜索中找到它。如果是这样,请告诉我,我将按照社区准则编辑或删除此帖子。
非常感谢您的帮助。谢谢!
【问题讨论】:
-
如果真正的目标是审计和编辑 JSON,使用 jq 来执行审计和编辑不是更好吗?
标签: json csv multiple-columns jq