如何用Bash脚本展示员工CSV文件的层级树形结构?
用Bash脚本实现员工层级树形结构展示
可以用awk编写脚本处理CSV文件,完成树形层级生成和根节点标注,以下是完整脚本:
#!/usr/bin/env awk -f BEGIN { FS = "," # 跳过表头行 getline } # 存储员工信息,构建ID与姓名、经理ID的映射,同时记录每个经理的下属列表 { id = $1 manager_id = $2 fullname = $3 " " $4 emp_info[id]["name"] = fullname emp_info[id]["manager"] = manager_id subordinates[manager_id] = subordinates[manager_id] " " id } END { # 处理所有顶层管理者(managerid为0的员工) split(subordinates[0], top_managers) for (i in top_managers) { top_id = top_managers[i] if (top_id == "") continue top_name = emp_info[top_id]["name"] # 打印顶层节点 printf "%s:%s(%s:%s)\n", top_id, top_name, top_id, top_name # 递归处理下属,初始前缀为空,层级从1开始 print_subordinates(top_id, "", 1, top_id, top_name) } } # 递归打印下属节点的函数 function print_subordinates(parent_id, prefix, level, root_id, root_name, subs, i, sub_id, new_prefix) { split(subordinates[parent_id], subs) for (i in subs) { sub_id = subs[i] if (sub_id == "") continue # 根据层级生成对应前缀 new_prefix = (level == 1) ? "+" : prefix "-" # 打印当前节点,附带根管理者信息 printf "%s%s:%s(%s:%s)\n", new_prefix, sub_id, emp_info[sub_id]["name"], root_id, root_name # 递归处理当前节点的下属 print_subordinates(sub_id, new_prefix, level + 1, root_id, root_name) } }
使用步骤
- 将代码保存为文件
emp_tree.awk - 赋予脚本执行权限:
chmod +x emp_tree.awk - 执行脚本处理你的CSV文件:
./emp_tree.awk 你的文件名.csv
脚本说明
- BEGIN块:设置CSV分隔符为逗号,跳过表头行避免处理无效数据。
- 主处理块:遍历每一行员工数据,存储员工的姓名、直属经理ID,同时维护每个经理对应的下属ID列表。
- END块:筛选出所有顶层管理者(直属经理ID为0的员工),逐个打印顶层节点后,调用递归函数处理其下属层级。
- 递归函数:根据当前层级生成树形前缀(
+、+-、+--等),打印员工信息并标注其所属的顶层管理者,再递归处理该员工的下属。
内容的提问来源于stack exchange,提问作者user8756412
相关产品推荐
相关产品推荐

