跳到正文

删除重复行

清理列表:去除重复、正确排序、删除空行。它会告诉您哪些行重复了、重复了几次,而不是悄悄把您的列表变短。

  • 绝不存储
  • 无需排队,无需等待
  • 无需注册,无水印
排序
整理
结果

结果将显示在这里。

使用方法

1

粘贴列表

邮箱、网址、商品编码,每行一项什么都可以。也可以拖放一个文本文件。

2

决定什么算“相同”

忽略首尾空格、忽略大小写、保留第一项或最后一项——或者把所有出现过重复的行全部删除。

3

排序和整理

自然排序、倒序、随机打乱、添加行号或删除空行——然后复制结果。

保留下来的行会怎样

本页有两种不同的空白处理方式,最好不要混淆。为比较而去除空格只用于生成键,从不修改您的行——保留下来的那一行,原有的空格一个不少。整理选项则正好相反:删除缩进、合并连续的空格和制表符、去除行首尾空格都是真正的修改,而且发生在去重之前,所以开启其中任何一项,都会在改变行的外观的同时,悄悄改变什么算作重复。

空行和其他行一样参与比较,这意味着第一个空行之后的所有空行都会和其他重复项一起消失——带有段落间隔的列表,处理后只会在第一个空行原来的位置留下一个空行。另外,重复项报告显示的是键,而不是您的原始行:去除了首尾空格,如果您选择了忽略大小写,还会转成小写。因此,列表中同时出现的Smith和SMITH只会被报告一次,以小写显示,次数为二。这份报告最多列出出现最多的五十项。

无论输入是什么,输出都只用换行符(LF)连接,所以从Windows文件粘贴进来的列表,经过处理后会丢掉回车符——这通常正是您想要的,但如果您要把结果粘贴回某个在意这一点的程序,就值得留意。还有一个副作用:开启“忽略大小写”不仅会改变比较,也会改变排序,而且此时排序也不再区分带重音的字母和普通字母,所以resume和résumé会排在一起,而不是分开。

如果您需要的是别的

如果列表实际上是一张表格,按行比较就是用错了工具。在CSV中,“重复”如果指的是两行在某一列上相同,那就不是字符串的问题,把它当成字符串处理,要么漏掉重复项,要么删掉只是看起来相似的行。电子表格自带的“删除重复值”可以正确处理您已经打开的文件,而mlr uniq -g可以在命令行中指定决定重复的字段,文件多大都能处理。

如果列表大到放不进一个标签页,或者您下周还要再清理一次,命令行只需一个流式处理的表达式:awk '!seen[$0]++'会保留第一项和原始顺序,这正是本页的默认做法,而且能处理比内存还大的文件。它不会去除空格、不会忽略大小写,也不会报告哪些重复了——这就是取舍,而对于一千万行的文件,这是正确的取舍。

常见问题

我的列表会被存储吗?

不会。不存储任何内容,也不发出任何请求。页面加载完成后,即使断开网络也照样能用。

为什么去重之后还有重复项?

几乎总是行尾空白造成的。两行末尾的空格数量不同,在屏幕上看起来一模一样,实际却不同,所以精确比较会把两行都保留——于是您以为工具坏了。正因如此,这里默认开启了比较前去除首尾空格。重要的是,它只影响比较:保留下来的那一行仍是原始文本,因为悄悄修改您的行并不是“删除重复项”的本意。

保留的是哪一项?

默认保留第一项,其余各行的顺序保持不变——当列表本身已经按有意义的顺序排列时,这一点很重要。您也可以改为保留最后一项,或者删除所有出现过重复的行,只留下恰好出现一次的行。最后这种方式可以用来找出列表中独有的条目。

为什么排序后item10排在item2前面?

这是普通的字母排序,“1”排在“2”前面,根本不会比较到数字的其余部分。开启自然排序后,连续的数字会按数值比较,item2就会排在item10前面——这才是人们期望的顺序。带重音的文字也能正确处理:简单的比较会把“Zürich”排在“Zyzzyva”之后,因为它比较的是底层的编码数值,而不是字母本身。

会告诉我删除了什么吗?

会——出现过多次的行会连同次数一起列出,出现最多的排在最前。知道是哪一项出现了四次,通常比知道少了三行更有用。

随机打乱真的是随机的吗?

是的。它使用Fisher-Yates洗牌算法和浏览器的加密随机数源。常见的偷懒做法——用随机比较函数来排序——根本不算洗牌:排序算法假定比较结果是一致的,用随机比较得到的结果会明显偏向原始顺序。如果您要从名单里抽出中奖者,这个差别很重要。

有大小限制吗?

受可用内存限制,而不是固定的大小上限。几十万行的列表完全没问题。

小贴士: 排序使用浏览器的语言规则,所以带重音的字母和不同的字母表会按读者期望的顺序排列,而不是按字节值排列。这也意味着不同浏览器之间的顺序可能略有差异。非常大的列表会整个载入内存。

把这个工具放到您的网站上

博客、课程页面或帮助文章均可免费使用。粘贴一段代码,访客就能直接在您的页面上使用。