【问题标题】:jq: recursion -> nested arraysjq: 递归 -> 嵌套数组
【发布时间】:2021-05-06 22:28:17
【问题描述】:

如何用 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",
               "type":"group",
               "nested":[
                  {
                     "name":"nestednestedproject2",
                     "type":"project"
                  }
               ]
            }
         ]
      },
      {
         "name":"rootproject1",
         "type":"project"
      },
      {
         "name":"rootgroup2",
         "type":"group",
         "nested": []
      }
   ]
}

预期输出:

"rootgroup1","group",""
"nestedproject1","project","rootgroup1"
"nestedgroup1","group","rootgroup1"
"nestednestedproject2","group","rootgroup1/nestedgroup1"
"rootproject1","project",""
"rootgroup2","group",""

试试:

jq -r '.structure[] | .. | "\(.name?) \(.type?)"'

仍然不确定,如何创建父路径。

【问题讨论】:

  • 你用jq做了什么尝试,它是如何失败的?

标签: bash shell path jq recursive-datastructures


【解决方案1】:

根据我的理解,以下实现了该问题的解决方案:

# $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","group","/rootgroup1"
"nestednestedproject2","project","/rootgroup1/nestedgroup1"
"rootproject1","project","/"
"rootgroup2","group","/"

这在某些方面与示例输出不同,但希望您可以从此处获取。

【讨论】:

  • 谢谢,它也应该输出 rootgroup1nestedgroup1,但我试图了解这些有什么不同..
  • 我已经修改了程序,所以现在它也产生了六行输出。
  • 似乎缺少某些东西,第三列应该引用所有父组,例如行 "nestednestedproject2","project","/nestedgroup1/nestednestedproject2" 应该看起来像 "nestednestedproject2","project","/rootgroup1/nestedgroup1" 并且应该更好,更容易和更正确地摆脱第一个“ /" 斜线。我用预期的结果更新了问题。谢谢
  • 好极了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多