我有一个现有的json文件,我需要转换,但我有它的麻烦。
下面是一个结构的例子:
jq -r '.document.results.summary.run.[] | [.run_number, .cinfo] ' input.json
[
"42",
[
{
"name": "Joe shmo",
"state": "AZ",
"city": "Phoenix"
},
{
"name": "Jane shmo",
"state": "CA",
"city": "Blythe"
]
]
[
"84",
[
{
"name": "Jake shmo",
"state": "NY",
"city": "Albany"
},
{
"name": "Jay shmo",
"state": "TN",
"city": "Franklin"
]
]
I need to convert this to a CSV to look like:
"run_number","cinfo.name","cinfo.state","cinfo.city"
Example:
"42","Joe shmo","AZ","Phoenix"
"42","Jane shmo","CA","Blythe"
"84","Jake shmo","NY","Albany"
"84","Jay shmo","TN","Franklin"
字符串
我试着用|@csv我得到:jq: error (at input.json:1397): array ([{"@name":"...) is not valid in a csv row
我相信这是因为它是一个多个索引的数组。我如何使用jq转换输出?
3条答案
按热度按时间vcirk6k61#
你尝试将
@csv
应用于一个包含非字符串的数组。你必须分解它们才能得到值。字符串
如果一切顺利(如果您提供了
input.json
,我可以测试它),这应该会产生型
5t7ly7z52#
你的代码示例中没有有效的JSON文件。也许你想这样写:
字符串
在这种情况下,您可以使用以下命令:
型
你会得到这样的结果:
型
bd1hkmkf3#
另一种方法是将以下内容标记到已有的
jq
过滤器(demo)的末尾:字符串
完整的过滤器应该是:
型
为了理解它是如何工作的,让我们分解它,看看
[.run_number, .cinfo]
生成的第一行会发生什么:.[1] []
将首先解压缩info数组,这样它将产生两个对象,即,型
[ .[] ]
,这将把它们转换为数组,如下所示:型
[ .[0] ]
(即[ "42" ]
)时,jq
将对流中的两个数组执行数组concat,导致:型
@csv
过滤器,生成我们需要的行。对另一个
run
也重复整个过程,我们得到了所需的输出。