极简工具箱

免费在线工具 · 本地计算 · 无需上传

文本去重:保序去重、忽略大小写与大批量处理

一份 5 万行的邮箱列表,重复项可能占三成。手工去重不现实,Excel 又会把长数字改坏——按行去重是最稳的做法。

广告位(百度联盟)

一、保序还是排序

两种去重方式,结果集相同但顺序不同:

保序更常用,因为顺序往往承载信息(按时间、按优先级)。

二、去重前要不要清洗

直接按行比对,Alice@x.com 和 alice@x.com (末尾有空格)会被当成两条。常见清洗动作:

  1. 去掉首尾空白(trim)。
  2. 统一大小写(邮箱、域名、标签通常不区分大小写)。
  3. 去掉全角空格、\r(Windows 换行残留)、零宽字符。
  4. 统一分隔符(; 与 ,)。

清洗规则取决于数据语义:用户名、密码、文件名不能随便统一大小写,邮箱的本地部分严格说也区分大小写(实际几乎没人这么用)。

三、按行去重 vs 按字段去重

CSV 场景直接按行去重往往无效,因为同一邮箱的其他列(姓名、时间)可能不同。要按主键列去重,用脚本更靠谱:

import csv
seen, rows = set(), []
with open('in.csv', encoding='utf-8-sig', newline='') as f:
    for r in csv.DictReader(f):
        k = r['email'].strip().lower()
        if k in seen:
            continue
        seen.add(k)
        rows.append(r)

四、Excel 去重的局限

「数据 → 删除重复值」很方便,但有三个问题:

所以涉及账号、证件、订单的数据,不要用 Excel 中转。

五、大批量怎么处理

几十万行在浏览器里处理会卡。命令行更合适:

# 保序去重(awk 记录首次出现)
awk '!seen[$0]++' in.txt > out.txt

# 排序去重
sort -u in.txt > out.txt

# 忽略大小写 + 去空白
tr -d '\r' < in.txt | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | awk '!seen[tolower($0)]++' > out.txt

awk '!seen[$0]++' 是保序去重的经典写法:第一次见到时 seen[$0] 为 0(取反为真,打印),之后自增为非 0(不打印)。

六、去重后要核对

去重最容易出的问题是「删多了」:

用 文本对比 把「去重前」和「去重后」比一下,能直观看到删了哪些行。

七、另外两种「去重」

八、工具

小批量(几万行以内)直接粘进 文本去重工具,可选「保序 / 排序」「忽略大小写」「去首尾空白」;去重前后用 字数统计 核对行数与字符数变化。

小结

保序去重保留首次出现顺序,排序去重便于对比;先去空白再统一大小写;CSV 要按字段去重而不是整行;Excel 会毁掉长数字;大批量用 awk '!seen[$0]++' 或 sort -u。

本文相关工具(本地计算,无需上传)

更多使用教程