shell 如何使用bash显示层次结构?

hm2xizp9  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(103)

我有一个如下的csv文件。ID是每个员工的唯一标识符,而MANAGERID是他/她的经理的ID。

id,managerid,firstname,lastname,dob,address
1,0,John,A,1976-01-01,some where
108,12,Tom,B,1996-01-01,some where
85,12,Jerry,C,1975-01-01,some where
12,1,Winsor,D,1984-01-01,some where
16,85,Smith,H,1977-01-01,some where
100,0,Ray,G,1999-01-01,some where
22,100,Albert,B,1980-01-01,some where
17,22,Robert,J,1980-01-01,some where
21,22,Linda,K,1981-01-01,some where
35,17,Lily,J,1968-01-01,some where
101,0,Sam,A,1995-01-01,some where
105,101,Liz,Z,1988-08-08,earth

我想使用bash命令/脚本打印出结构,像一棵树。最高管理者是根,下面是部门经理和部门的员工。最高管理者的ID和姓名也应列在员工旁边。
我还不知道怎么做。
预期输出应该如下所示。

1:John A(1:John A)
+12:Winsor D(1:John A)
+-85:Jerry C(1:John A)
+--16:Smith H(1:John A)
+-108:Tom B(1:John A)
100:Ray G(100:Ray G)
+22:Albert B(100:Ray G)
+-21:Linda K(100:Ray G)
+-17:Robert J(100:Ray G)
+--35:Lily J(100:Ray G)
101:Sam A(101:Sam A)
+105:Liz Z(101:Sam A)

任何帮助都将不胜感激!

nimxete2

nimxete21#

如果你已经安装了python,你可以试试这段代码。它可以在python2和python3中工作。
tree.py:

import sys

class Employee:
  def __init__(self, id, pid, name):
    self.id = id
    self.pid = pid
    self.name = name
    self.level = 0
    self.managerinfo = self.id+": "+self.name

def printlist(rlist): 
  for e in rlist:
    print('+'.ljust(e.level+1,'-')+e.id+":"+e.name+"("+e.managerinfo+")")

def insone(mylist, id, newe):
  idx=0
  for e in mylist:
    idx+=1
    if e.id == id:
      newe.level = e.level+1
      newe.managerinfo = e.managerinfo
      mylist.insert(idx,newe)
      #print('Insertint '+newe.id+':'+newe.name+' after '+e.id+':'+e.name)
      return True
  return False

def sortlist(sorted,unsorted):
  #print("begin:"+str(len(unsorted)))
  if len(unsorted)<=0:
    return
  for u in unsorted:
    if u.pid == '0':
      sorted.append(u)
      unsorted.remove(u)
    else:
      if insone(sorted, u.pid, u):
        unsorted.remove(u)
  #print("end:"+str(len(unsorted)))
  sortlist(sorted,unsorted)

if __name__ == "__main__":

  file1 = open(sys.argv[1], 'r')
  Lines = file1.readlines()

  rawlist=[]
  line=0
  for row in Lines:
    line+=1
    if line>1:
      a = row.strip().split(',')
      rawlist.append(Employee(a[0],a[1],a[2]+" "+a[3]))

  sortedlist = []
  sortlist(sortedlist,rawlist)

  printlist(sortedlist)

那就运行这个

[ rquery]$ python tree.py samples/organization.csv
+1:John A(1: John A)
+-12:Winsor D(1: John A)
+--85:Jerry C(1: John A)
+---16:Smith H(1: John A)
+--108:Tom B(1: John A)
+100:Ray G(100: Ray G)
+-22:Albert B(100: Ray G)
+--17:Robert J(100: Ray G)
+---35:Lily J(100: Ray G)
+--21:Linda K(100: Ray G)
+101:Sam A(101: Sam A)
+-105:Liz Z(101: Sam A)

或者,如果您可以下载rq,它可以在一个命令行内完成此任务。

[ rquery]$ ./rq -n -q "p d/,/ | s switch(comparenum(@level,0),1,'+','')+pad('-',@level-1)+id+':'+firstname+' '+lastname+'('+root(id)+':'+root(firstname)+' '+root(lastname)+')' | h k:id;p:managerid" samples/organization.csv
1:John A(1:John A)
+12:Winsor D(1:John A)
+-85:Jerry C(1:John A)
+--16:Smith H(1:John A)
+-108:Tom B(1:John A)
100:Ray G(100:Ray G)
+22:Albert B(100:Ray G)
+-21:Linda K(100:Ray G)
+-17:Robert J(100:Ray G)
+--35:Lily J(100:Ray G)
101:Sam A(101:Sam A)
+105:Liz Z(101:Sam A)

相关问题