重复行删除工具

从文本中删除重复行,仅保留唯一行

加载示例

输入行

唯一行

本地运行 · 粘贴密钥安全无忧
唯一行将显示在这里…

什么是重复行删除?

重复行删除是逐行扫描一段文本、只保留每个唯一行首次出现位置的过程。在线删除重复行时,工具会按换行符拆分输入内容,使用基于哈希的数据结构(如 Set)记录已出现的行,并只输出之前未见过的行。原始行顺序保持不变。

当两行逐字符完全一致时,它们才被视为重复。然而现实数据很少能做到精确匹配。行首或行尾的空白字符、大小写不一致,以及制表符或回车符等不可见字符,都可能导致看起来相同的行被当作唯一行处理。因此,大多数去重工具都提供不区分大小写比较和比较前修剪空格两个选项。

去重与排序是两种不同的操作。Unix 命令 sort -u 会先对所有行进行字母排序,再删除相邻重复项,这会改变行的顺序。如果需要保留原始行顺序,应使用“已见集合”方法:按顺序遍历每一行,将其规范化形式加入集合,并跳过键已存在的行。本工具采用“已见集合”方法,因此首次出现的行会保留在其原始位置。

为什么使用这个重复行删除工具?

粘贴文本,选择比较选项,立即看到去重结果。无需命令行操作,无需编写正则表达式,无需上传文件。

即时去重
输入或粘贴内容时结果实时更新。切换大小写敏感和空格修剪选项,即可查看不同设置对输出的影响,无需重新运行。
🔒
隐私优先处理
所有去重操作均通过 JavaScript 在您的浏览器中完成。您的文本始终保留在本地设备上,不会上传至服务器或留下任何记录。
🎯
可配置匹配规则
启用不区分大小写模式,将「Apple」和「apple」视为同一行。开启空格修剪,在比较时忽略行首和行尾的空格。
📋
无需注册账号
打开页面即可开始去重。无需注册、无需浏览器扩展、无需安装桌面软件。支持任何配备现代浏览器的设备。

重复行删除工具使用场景

前端开发
清理 CSS 类名列表、删除重复的 import 语句,或去除 i18n 翻译键中的重复项。在提交前删除重复内容,可避免打包体积膨胀,减少合并冲突。
后端开发
在合并分支后,去除 requirements.txt、Gemfile 或 package.json 依赖列表中的重复条目。删除白名单、黑名单或路由表中的重复记录。
DevOps 与基础设施
清理 .env 文件、主机列表或 Kubernetes ConfigMap 中的重复条目。重复的环境变量会造成静默覆盖,在部署前发现这些问题,可避免难以追踪的配置错误。
QA 与测试自动化
删除测试执行清单中重复的测试用例 ID,或去除自动生成测试套件中的重复断言。对日志输出中的错误信息去重,以获取唯一失败类型的集合。
数据工程
删除 CSV 导出文件或粘贴为文本的 SQL 查询结果中的重复行。在将邮件列表、用户 ID 列表或标签列表导入数据库或数据管道前进行清洗。
学生与学习者
删除词汇表、参考文献或学习笔记中的重复条目。从多个来源粘贴内容,无需安装电子表格软件即可获得干净的唯一列表。

去重方法比较

删除重复行有多种方法,各自在顺序保留、内存占用和准确性上有不同的权衡。

方法工作原理输出顺序适用场景
SetHash-based, O(1) lookupUnorderedJavaScript Set, Python set()
Sorted + scanSort then skip adjacentSorted outputUnix sort -u, C++ std::unique
Seen-set + listTrack seen, preserve orderOriginal orderThis tool, Python dict.fromkeys()
Bloom filterProbabilistic membershipMay miss someLarge-scale pipelines, Redis
SQL DISTINCTDatabase-level dedupQuery-dependentSELECT DISTINCT col FROM table

大小写敏感与空格处理

两个选项控制本工具判断两行是否重复的方式。了解何时使用各选项,可避免误判(将不同的行当作重复)和漏判(未能识别应匹配的行)。

区分大小写(默认:开启)
开启时,「Apple」和「apple」被视为不同的行。当对用户提交的数据、域名列表或大小写不一致但含义相同的文本进行去重时,请关闭此选项。
修剪空格(默认:开启)
开启时,比较前会去除行首和行尾的空格和制表符。这可以识别看起来相同但含有不可见字符的行,常见于复制粘贴的终端输出、有缩进的配置文件以及编辑器产生的多余字符。

代码示例

在 JavaScript、Python、Go 和命令行中以编程方式删除重复行。每个示例均展示保留顺序的去重方式,并处理大小写敏感问题。

JavaScript
const text = `apple
banana
apple
Cherry
banana
cherry`

// Remove exact duplicates, preserve order
const unique = [...new Map(
  text.split('\n').map(line => [line, line])
).values()].join('\n')
// → "apple\nbanana\nCherry\ncherry"

// Case-insensitive deduplication
const seen = new Set()
const ciUnique = text.split('\n').filter(line => {
  const key = line.toLowerCase()
  if (seen.has(key)) return false
  seen.add(key)
  return true
}).join('\n')
// → "apple\nbanana\nCherry"

// Trim whitespace before comparing
const trimDedup = text.split('\n').filter(line => {
  const key = line.trim().toLowerCase()
  if (seen.has(key)) return false
  seen.add(key)
  return true
}).join('\n')
Python
text = """apple
banana
apple
Cherry
banana
cherry"""

lines = text.splitlines()

# Remove duplicates, preserve order (Python 3.7+)
unique = list(dict.fromkeys(lines))
# → ['apple', 'banana', 'Cherry', 'cherry']

# Case-insensitive deduplication
seen = set()
ci_unique = []
for line in lines:
    key = line.lower()
    if key not in seen:
        seen.add(key)
        ci_unique.append(line)
# → ['apple', 'banana', 'Cherry']

# With whitespace trimming
seen = set()
trimmed = []
for line in lines:
    key = line.strip().lower()
    if key not in seen:
        seen.add(key)
        trimmed.append(line)
Go
package main

import (
	"fmt"
	"strings"
)

func removeDuplicates(text string) string {
	lines := strings.Split(text, "\n")
	seen := make(map[string]bool)
	result := make([]string, 0, len(lines))

	for _, line := range lines {
		if !seen[line] {
			seen[line] = true
			result = append(result, line)
		}
	}
	return strings.Join(result, "\n")
}

func main() {
	text := "apple\nbanana\napple\ncherry\nbanana"
	fmt.Println(removeDuplicates(text))
	// → apple\nbanana\ncherry
}
CLI (bash)
# Remove duplicates (sorts output — does not preserve order)
sort -u file.txt

# Remove duplicates while preserving original order
awk '!seen[$0]++' file.txt

# Case-insensitive dedup, preserve order
awk 'BEGIN{IGNORECASE=1} !seen[tolower($0)]++' file.txt

# Trim whitespace then dedup
sed 's/^[[:space:]]*//;s/[[:space:]]*$//' file.txt | awk '!seen[$0]++'

# Count duplicates before removing
sort file.txt | uniq -c | sort -rn

常见问题

删除重复行与使用 sort -u 有什么区别?
sort -u 命令首先对所有行进行字母排序,然后删除相邻的重复项,这会改变原始行顺序。本工具使用“已见集合”方法,按顺序遍历每一行,跳过已出现过的行,从而保留原始顺序。当您需要同时排序和去重时,使用 sort -u;当顺序很重要时,使用“已见集合”方法。
删除重复行时,我的文本会发送到服务器吗?
不会。所有处理均通过 JavaScript 在您的浏览器中完成,文本不会离开您的设备。您可以打开浏览器的开发者工具 Network 标签页,在粘贴文本和切换选项时确认没有发出任何网络请求。
这个工具最多能处理多少行?
本工具在处理数万行时表现良好。JavaScript 的 Set 平均查找时间为 O(1),因此在现代硬件上对 10 万行进行去重不到 100 毫秒。对于超过几兆字节的文件,建议在命令行使用 awk '!seen[$0]++' 单行命令,它以流式方式处理文件,无需将全部内容加载到内存中。
不区分大小写的去重是如何工作的?
关闭大小写敏感时,每行在与已见行集合比较前会先转换为小写。输出中保留首次出现时的原始大小写形式。因此,若输入中第 1 行为「Apple」、第 5 行为「apple」,则保留「Apple」,删除「apple」。
可以同时删除重复行并进行排序吗?
本工具在删除重复行时不改变行顺序。若需要排序后的唯一输出,请先使用同类别中的行排序工具对文本排序,再将排序结果粘贴到此处删除剩余重复项。也可以在命令行使用 sort -u 一步完成。
空行和仅含空格的行如何处理?
空行与其他行一样处理。若文本中有三个空行,只保留第一个。开启空格修剪时,仅含空格或制表符的行在比较前会被规范化为空字符串,因此它们都被视为第一个空行或仅含空格行的重复项。
如何按特定列删除 CSV 文件中的重复行?
本工具对整行进行比较,而非单独的列。若要按特定列对 CSV 进行去重,可使用带字段分隔符的 awk 命令:awk -F',' '!seen[$2]++' file.csv 可删除第二列值重复的行。在 Python 中,使用 pandas:df.drop_duplicates(subset=['column_name'])。对于 SQL 数据,在目标列上使用 SELECT DISTINCT 或 GROUP BY。