如何统计文件路径列表中同名文件次数并按出现次数降序排序
错误原因
原命令存在三处核心问题:
- awk变量误用:
$NR中的NR是awk内置的当前处理行号变量,并非最后一个字段的标识:处理第1行时取第1个字段、第2行取第2个字段、第3行取第3个字段,后续行因字段数不足直接输出空值,完全无法提取到路径末尾的文件名。 - 缺少前置排序:
uniq -c只能统计相邻的重复行,原命令未先将同名文件排序到相邻位置,即使提取到文件名也会出现统计错误。 - sort参数缺失:原命令的
sort默认按字典序升序排列,无法实现按出现次数从高到低排序的需求。
可直接运行的正确命令
基础修正版(逻辑直观易理解)
awk -F '/' '{print $NF}' file.txt | sort | uniq -c | sort -nr
高效版(大文件场景性能更优)
awk -F '/' '{count[$NF]++} END{for(name in count) print count[name], name}' file.txt | sort -nr
运行任意一条命令,都能得到符合预期的统计结果:
3 foo 2 bar 1 bar2 1 foo2
注:出现次数相同的文件默认按文件名字典序排列,若需要调整同次数下的排序规则,可修改sort的匹配字段参数即可。
命令逻辑说明
-F '/':指定斜杠/为字段分隔符,将文件路径按目录层级拆分$NF:awk内置变量,代表当前行拆分后的最后一个字段,也就是路径最末端的文件名- 基础版中第一个
sort:将所有文件名按字典序排序,让同名文件相邻,满足uniq的统计要求 uniq -c:统计相邻重复行的出现次数,输出格式为「出现次数 文件名」- 高效版中的
count[$NF]++:通过数组直接累计每个文件名的出现次数,不需要额外排序、调用uniq,处理GB级大文件时速度优势明显 - 末尾的
sort -nr:-n表示按数值规则排序,-r表示逆序(从大到小),最终实现按文件出现次数从高到低排列的效果。
内容的提问来源于stack exchange,提问作者user1869474
相关产品推荐
相关产品推荐

