Unix环境下排除指定值查找CSV文件列中重复项的脚本实现
解决方案:高效处理大CSV的重复项排查
没问题,我来帮你搞定这个2.5GB大CSV的重复项排查需求,顺便把你疑惑的awk语法讲明白~
最优脚本(单遍历,适合大文件)
直接用awk就能一次遍历完成,不用排序,对大文件效率超高:
# 替换your_large_file.csv为你的文件名,exclude值改成你要排除的高频项 awk -F ',' -v exclude="none" 'NR>1 { if ($2 != exclude) { count[$2]++ } } END { for (val in count) { if (count[val] > 1) print val } }' your_large_file.csv
逐行解释(包括你疑惑的++A[$2])
-F ',':告诉awk用逗号作为CSV的分隔符,如果你的文件是制表符分隔,改成-F '\t'就行-v exclude="none":把要排除的高频值做成变量,后续要改直接换引号里的内容(比如示例的"2r")NR>1:跳过第一行的表头(NR是awk内置的行号变量)if ($2 != exclude):只处理第二列不等于排除值的行,直接过滤掉不需要的高频项count[$2]++:这就是你问的++A[$2]的核心逻辑!count是awk的关联数组(类似Python的字典),键是第二列的内容,每次遇到同一个值,就把对应数组元素的计数加1。awk会自动初始化不存在的数组元素为0,所以第一次遇到某值时,count[$2]从0变成1,之后每遇到一次就加1,完美实现次数统计。END {...}:所有行处理完后执行的收尾逻辑,遍历数组里的每个值,只要出现次数大于1,就打印出来——这些就是你要找的重复项。
备选方案(sort+uniq,适合小文件)
如果你之前习惯用uniq,也可以这么写,但不推荐2.5GB的大文件,因为排序会占用大量内存和时间:
tail -n +2 your_large_file.csv | awk -F ',' -v exclude="none" '$2 != exclude {print $2}' | sort | uniq -d
tail -n +2:跳过表头- awk过滤掉排除值后只输出第二列
sort:uniq要求输入有序,所以必须先排序uniq -d:只输出重复出现的行
内容的提问来源于stack exchange,提问作者17th Lvl Botanist
相关产品推荐
相关产品推荐

