我有一個如下所示的 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)
任何幫助將非常感激!
uj5u.com熱心網友回復:
如果你已經python安裝了,你可以試試這個代碼。它適用于python2和python3。
樹.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)
uj5u.com熱心網友回復:
除非您的實際輸入包含員工之間的回圈管理關系,否則這應該適用于 GNU awk:
$ cat tst.awk
BEGIN {
FS = ","
}
{
mgrs[$2]
mgmt[$2][$1]
name[$1] = $1 ":" $3 " " $4
}
END {
tree(0, 1, "", " ")
}
function tree(mgr, _top, arm, ext) {
if (!(mgr in mgrs))
return
for (mge in mgmt[mgr]) {
if (_top)
top = mge
print arm name[mge] "(" name[top] ")"
tree(mge, 0, arm ext, "-")
}
}
$ awk -f tst.awk file
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/527015.html
標籤:linux重击壳命令嘘
下一篇:如何更改行背景的顏色?c#
