50G大TSV文件处理:如何删除邮箱@前的点保留后缀mail.com的点
问题本质
原有脚本不加区分替换了全文所有.,包括邮箱域名部分的点,后续用sed修正的逻辑不仅多了一次全文件IO开销,还仅适用于后缀为mail.com的场景,通用性差,处理50G级大文件时效率极低。
优化方案
方案1:Python原生实现(无系统依赖)
优化逻辑:
- 放弃全量加载50G文件到内存的操作,改为逐行读取处理,内存占用稳定在MB级
- 按
@拆分邮箱内容,仅对@前的用户名部分做删除点操作,后缀部分完全保留,不存在误改后缀的问题 - 一次IO即可完成全部处理,无需二次修改输出文件
代码示例:
import sys with open('file.tsv', 'r', encoding='utf-8') as in_file, open('newFile.tsv', 'w', encoding='utf-8') as out_file: for line in in_file: stripped = line.strip() # 空行或不符合邮箱格式的行直接保留 if not stripped or '@' not in stripped: out_file.write(line) continue # 仅拆分一次,避免后缀中存在@的异常场景 username, suffix = stripped.split('@', 1) username = username.replace('.', '') # 保留原始行的换行符 out_file.write(f"{username}@{suffix}\n")
方案2:纯Linux单行命令(大文件处理效率更高)
对于50G级的大文件,直接用awk处理的性能远高于Python脚本,一次IO即可完成所有操作:
awk -F '@' '{gsub(/\./,"",$1); print $1"@"$2}' file.tsv > newFile.tsv
该命令会自动按@拆分每行,仅替换第一部分(用户名)中的所有点,后缀部分完全保留,支持所有合法邮箱后缀格式,通用性极强。
内容的提问来源于stack exchange,提问作者Younes Zaidi
相关产品推荐
相关产品推荐

