如何去除3列CSV文件中基于第一列及第二列前3字符的重复行?
基于第一列+第二列前3字符去除CSV重复行的解决方案
嘿,这个需求我之前帮不少人处理过,刚好有几个实用的方案,不管你习惯用命令行快速搞定,还是用脚本灵活处理,都能满足你的要求~
方案1:用awk命令行快速处理(适合大文件/简单场景)
awk是处理文本文件的神器,一行命令就能搞定,而且对第二列不足3个字符的情况自动兼容(substr函数会直接取全部字符)。
不带表头的情况:
awk -F ',' '!seen[$1 SUBSTR($2,1,3)]++' list.csv > deduplicated_list.csv
- 解释:
-F ','指定CSV的分隔符为逗号seen是一个关联数组,用来记录已经出现过的「第一列+第二列前3字符」组合!seen[$1 SUBSTR($2,1,3)]++表示:第一次遇到这个组合时打印该行,之后再遇到就跳过
带表头的情况(需要保留第一行表头):
如果你的CSV有表头,只需要加个判断跳过表头的处理:
awk -F ',' 'NR==1{print;next} !seen[$1 SUBSTR($2,1,3)]++' list.csv > deduplicated_list.csv
NR==1{print;next}表示第一行直接打印,然后跳过后续逻辑,继续处理下一行
方案2:用Python脚本处理(适合复杂CSV/需要扩展的场景)
如果你的CSV存在带引号的字段(比如第二列里包含逗号),或者需要更灵活的逻辑控制,Python的csv模块会更靠谱,能避免手动拆分字段的坑。
import csv # 用来记录已经出现过的重复判定键 seen_keys = set() # 打开原文件和去重后的文件 with open('list.csv', 'r', newline='', encoding='utf-8') as in_file, \ open('deduplicated_list.csv', 'w', newline='', encoding='utf-8') as out_file: reader = csv.reader(in_file) writer = csv.writer(out_file) # 处理表头(如果有表头的话) try: header = next(reader) writer.writerow(header) except StopIteration: # 空文件的情况,直接退出 pass # 遍历每一行处理 for row in reader: # 确保至少有两列数据,避免索引错误 if len(row) >= 2: # 生成判定重复的键:第一列 + 第二列前3个字符(不足3则取全部) duplicate_key = (row[0], row[1][:3]) if duplicate_key not in seen_keys: seen_keys.add(duplicate_key) writer.writerow(row) else: # 列数不足的行,可选处理:要么直接写入,要么跳过 writer.writerow(row)
- 解释:
- 用
csv.reader和csv.writer处理CSV,自动处理带引号的字段 row[1][:3]切片操作会自动兼容第二列字符数不足3的情况(比如只有2个字符就取全部)- 加入了空文件、列数不足的异常处理,更健壮
- 用
注意事项
- 如果你的CSV分隔符不是逗号,记得修改对应参数:awk里改
-F的值,Python里可以给csv.reader加delimiter='你的分隔符' - 处理大文件时,awk的性能会比Python更好,内存占用更低
- 去重后的结果会保存在
deduplicated_list.csv里,原文件不会被修改
内容的提问来源于stack exchange,提问作者Chris C
相关产品推荐
相关产品推荐

