删除Example2.csv中与Example1.csv匹配邮箱的行(非逗号分隔CSV)
嘿,这个需求我熟!因为是伪CSV(非逗号分隔),所以得用能灵活处理任意分隔符的工具,下面给你两种实用的方案,选你顺手的来~
方案1:用awk命令(适合熟悉命令行的同学)
awk处理文本效率极高,而且能轻松适配各种分隔符,完全不用纠结是不是标准CSV。
核心逻辑
先把Example1里的所有邮箱存到一个“黑名单”数组里,然后遍历Example2,只保留邮箱不在黑名单里的行。
命令示例(按需修改参数)
# 请根据你的实际情况修改这两个参数: # 1. -F'\t':这里是指定分隔符为制表符,如果是竖线就改成-F'|',空格改成-F' ' # 2. $3:这里是Example2中邮箱所在的列(第3列),如果是第1列就改成$1 awk -F'\t' 'NR==FNR {emails[$1]=1; next} !emails[$3]' Example1.csv Example2.csv > filtered_Example2.csv
参数解释
-F'\t':指定文件的分隔符,不确定的话可以用cat -A Example2.csv查看(制表符会显示为^I,其他符号直接显示)NR==FNR:awk内置判断,当处理第一个文件(Example1)时,把每行的第1列(邮箱)存入emails数组!emails[$3]:处理第二个文件(Example2)时,检查第3列的邮箱是否不在黑名单里,不在就输出该行> filtered_Example2.csv:把处理后的结果保存到新文件,避免覆盖原文件
方案2:用Python脚本(适合不熟悉命令行的同学)
Python的写法更直观,就算是新手也能看懂,而且调试起来更方便。
脚本示例(按需修改参数)
# ---------------------- 请根据你的情况修改以下参数 ---------------------- delimiter = '\t' # 分隔符,比如制表符\t、竖线|、空格' ' email_column_index = 2 # Example2中邮箱列的索引(Python从0开始,第3列就是2) # ---------------------------------------------------------------------- # 读取Example1的邮箱,存入集合(查找速度比列表快N倍) with open('Example1.csv', 'r', encoding='utf-8') as f1: email_blacklist = {line.strip() for line in f1 if line.strip()} # 处理Example2,筛选出不匹配的行 with open('Example2.csv', 'r', encoding='utf-8') as f2, open('filtered_Example2.csv', 'w', encoding='utf-8') as out_file: # 先写入表头(如果你的文件有表头的话,没有就删掉这两行) header = f2.readline() out_file.write(header) for line in f2: line = line.strip() if not line: # 跳过空行 continue # 按分隔符拆分每行内容 columns = line.split(delimiter) # 确保列数足够,避免索引报错 if len(columns) > email_column_index: current_email = columns[email_column_index].strip() if current_email not in email_blacklist: out_file.write(line + '\n')
使用说明
- 修改开头的
delimiter和email_column_index参数,匹配你的文件情况 - 把脚本保存为
filter_emails.py,在文件所在目录运行python filter_emails.py - 处理后的结果会存在
filtered_Example2.csv里
关键注意事项
- 一定要确认分隔符:这是最容易踩坑的点,因为你的文件不是逗号分隔,必须指定正确的分隔符才能拆分出正确的邮箱列
- 确认邮箱列的位置:比如Example2的邮箱在第1列还是第5列,对应调整命令/脚本里的列索引
- 备份原文件:处理前最好备份Example2.csv,避免误操作覆盖原数据
内容的提问来源于stack exchange,提问作者soma76
相关产品推荐
相关产品推荐

