Unix Shell:用awk/sed按文件名聚合关联用户名
用awk实现文件名与对应去重用户名的聚合
核心最简命令(字典序输出)
'{fn=$1; sub(/.*\//, "", fn); user=$NF} !seen[fn,user]++ {map[fn] = map[fn] ? map[fn] "," user : user} END{for(f in map) print f, map[f]}' input.txt
命令解析
- 提取文件名:取每行第一个字段(带路径的文件名),剔除路径部分只保留纯文件名
- 提取用户名:直接取每行最后一个字段作为用户名
- 去重逻辑:用二维数组
seen[fn,user]记录「文件名-用户名」组合,避免同一用户重复出现在同一文件的列表中 - 聚合存储:用数组
map[fn]保存每个文件名对应的用户列表,首次添加用户直接赋值,后续用逗号拼接追加 - 输出结果:遍历
map数组,按字典序输出所有文件名及对应用户列表
保留首次出现顺序的版本
如果需要输出顺序与输入中文件名首次出现的顺序一致,可添加顺序记录数组:
'{fn=$1; sub(/.*\//, "", fn); user=$NF} !seen[fn,user]++ {if(!(fn in map)) order[++cnt]=fn; map[fn] = map[fn] ? map[fn] "," user : user} END{for(i=1;i<=cnt;i++) print order[i], map[order[i]]}' input.txt
内容的提问来源于stack exchange,提问作者Dandys
相关产品推荐
相关产品推荐

