如何为每个节点(分支)找到树的最大深度

  • 本文关键字:深度 分支 节点 linux bash tree
  • 更新时间 :
  • 英文 :


我正在尝试检索树中主分支的最大深度。例如:

如果我在Arch Linux发行版中执行"pactree-agdm",我会得到这样的东西:

gdm
|-gnome-shell
||-accountsservice
|||-glib2
||||-pcre
|||||-gcc-libs
||||| `-glibc provides glibc>=2.27
|||||   |-linux-api-headers provides linux-api-headers>=4.10
|||||   |-tzdata
|||||   `-filesystem
|||||     `-iana-etc
|||||-readline
||||||-glibc
||||||-ncurses
|||||| |-glibc
|||||| `-gcc-libs
|||||`-ncurses provides libncursesw.so=6-64

我想返回"gnome shell"分支,如下所示:

gnome-shell:7

由于"`-iana-etc"是7个级别中最深的子节点这里的一个问题是,我需要使用"|"(管道(和"`"(倒勾(查看所有子节点,因为它们中的任何一个都可能有另一个子节点。

我试图用awk实现这一点,但不知道如何指定"一个字符长"的字段。

请你提供一些基本的脚本,作为实现我目标的起点,并让我知道awk是否是完成这项任务的最佳工具?

以下是您考虑的开始:

$ awk -F'[`|]' '{ print NF,$0}' input
1 gdm
2 |-gnome-shell
3 ||-accountsservice
4 |||-glib2
5 ||||-pcre
6 |||||-gcc-libs
7 ||||| `-glibc provides glibc>=2.27
7 |||||   |-linux-api-headers provides linux-api-headers>=4.10
7 |||||   |-tzdata
7 |||||   `-filesystem
7 |||||     `-iana-etc
6 |||||-readline
7 ||||||-glibc
7 ||||||-ncurses
8 |||||| |-glibc
8 |||||| `-gcc-libs
7 |||||`-ncurses provides libncursesw.so=6-64

看起来我最终得到了和你一样的结果:iana等处于7级。然而,我有一个不同的结论:glibc和gcc-libs是级别8中最深的项目。

理想情况下,这些信息应该让你开始完成这个编程任务。

我认为awk是一个非常合理的选择。