【问题标题】:BASH - How to check for duplicate email addresses across multiple files?BASH - 如何检查多个文件中的重复电子邮件地址?
【发布时间】:2025-07-23 00:55:01
【问题描述】:

我目前正在处理一个需要向大量电子邮件地址发送电子邮件的项目。因此,我试图避免与服务提供商限制电子邮件等有关的任何“临时”故障。

我的计划是获取电子邮件地址的初始列表并将其分割成更小的(切碎的)列表,以便它们可以以交错的方式安排。由于发送电子邮件的敏感性,我想确保在任何截断列表中不存在重复的电子邮件地址。有没有办法通过 bash 做到这一点?

旁注,我 100% 确定主列表中的所有电子邮件地址都是唯一的,由于用于组成列表的查询的性质,我想确保我的脚本切碎了主列表,在截断的列表中创建重复的电子邮件地址没有缺陷。

【问题讨论】:

    标签: bash email split unique chunks


    【解决方案1】:

    您可以通过 cat (临时)将切碎的文件放在一起,并使用 sort --unique 删除重复项 - 然后检查结果是否与原始文件一样多:

    cat original_list | wc -l
    

    cat list_part* | sort --unique | wc -l
    

    如果结果相同,则没有重复。

    【讨论】:

    【解决方案2】:

    试试

     cat *.txt | sort | sort -u -c
    

    鉴于您的文件名以 .txt 结尾。 第一个排序命令对所有电子邮件地址进行排序。第二个排序命令检查没有两个连续的行相等,并在另一种情况下抛出错误。

    【讨论】:

    • 很好,我最终选择了 timos 解决方案,因为我可以直接比较计数。
    • 也使用您的解决方案来追踪重复项。再次感谢。
    【解决方案3】:

    问题

    您需要对唯一地址进行排序,然后将有序列表拆分成块。

    解决方案

    鉴于以下假设:

    1. 您的电子邮件存储在名为 emails_xxxx.txt 的文件中。 (注意:您可以为它们命名任何您喜欢的名称,但一组易于使用的合理文件名将使您的生活更简单。)
    2. 每一行包含一个地址。

    您可以使用较短的管道来处理此问题。 Sort 将接受一个 glob 模式或多个文件参数(例如来自 xargs),因此您可以避免“无用的 cat 使用”。然后将输出通过管道传输到 split,您可以在其中控制分块的各个方面。例如:

    sort --unique emails_*.txt |
    split --numeric-suffixes \
          --lines=200 \ 
          --suffix-length=4 \
          --verbose
    

    这会将已排序/过滤的行拆分为最多 200 行的块,并使用适合批处理的数字扩展名命名每个块。您可以调整行和后缀长度以满足您的要求。

    样本输出

    creating file `x0000'
    creating file `x0001'
    

    【讨论】:

    • 我不想将主列表拆分为较小的列表,这项工作已经完成。我只是验证没有由于拆分而​​创建重复。
    • @MikePurcell 了解...但是您必须处理异常。为什么不首先插入一个不会产生错误或异常的垫片呢?我很高兴其他答案对您有用,但我将把它留给其他可能觉得有用的人。
    • 不确定“处理异常”是什么意思。我编写的生成chop文件的算法足够灵活,可以改变生成的chop文件的大小。例如,前两个chop 文件应该只包含2K 电子邮件,而接下来的两个chop 文件可以是10K,最后每个chop 文件可以增加到50K 电子邮件地址。
    • @MikePurcell “例外”是指数据验证失败的情况。对我来说,防止已知的错误情况似乎更好,而不是通过数据验证检测它,然后事后处理。这绝对是“你的里程可能会有所不同”的领域,但我很乐意在聊天或 Twitter 上继续讨论。