如何解决jq:递归 -> 嵌套数组
如何用jq解析这个json结构?它应该递归地遍历叶子(项目和组)。
我的用例是: 使用 CLI 在 VCS 中创建项目和组。组可以有多个项目,组可以为空,项目必须事先创建父组。
类似的比喻是:
- 组 = 文件夹
- 项目 = 文件
- path =
/root-groups/nested-groups-level-1/nested-groups-level-2/nested-groups-level-N
格式的绝对路径
谢谢
{
"structure":[
{
"name":"rootgroup1","type":"group","nested":[
{
"name":"nestedproject1","type":"project"
},{
"name":"nestedgroup1","nested":[
{
"name":"nestednestedproject2","type":"project"
}
]
}
]
},{
"name":"rootproject1","type":"project"
},{
"name":"rootgroup2","nested": []
}
]
}
预期输出:
"rootgroup1","group",""
"nestedproject1","project","rootgroup1"
"nestedgroup1","rootgroup1"
"nestednestedproject2","rootgroup1/nestedgroup1"
"rootproject1",""
"rootgroup2",""
试试:
jq -r '.structure[] | .. | "\(.name?) \(.type?)"'
仍然不确定,如何创建父路径。
解决方法
以下实现了我理解的问题的解决方案:
# $prefix is an array interpreted as the prefix
def details($prefix):
def out:
select(has("name") and has("type")) | [.name,.type,"/" + ($prefix|join("/"))];
out,if (.nested | (. and length>0))
then .name as $n | .nested[] | details($prefix + [$n])
else empty
end;
.structure[]
| details([])
| @csv
给定您的样本输入,输出将是:
"rootgroup1","group","/"
"nestedproject1","project","/rootgroup1"
"nestedgroup1","/rootgroup1"
"nestednestedproject2","/rootgroup1/nestedgroup1"
"rootproject1","/"
"rootgroup2","/"
这在某些方面与示例输出不同,但希望您可以从这里获取。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。