清单去重排序反转怎么用?几百行文本整理的避坑指南
面对几百上千行的清单,去重、排序、反转是最常用的三个整理动作,但每个动作都有默认行为里没写出来的细节。这篇按「先分清动作、再确认默认行为、最后避坑」的顺序讲一遍。
- 文本去重默认按整行完全一致判断重复,行首或行尾多一个空格就会被当成两行
- 文本排序的升序是字典序,按字符逐个比较,所以 10 一定排在 9 前面
- 中文没有大小写,升序结果等价于按字符编码值排列,与拼音顺序无关
- 文本反转有字符、行、行内、单词四种模式,只有行反转之后每行内部的内容还是原样
- 整理前先确认换行符是否统一,单独的回车符在部分编辑器里也被算作换行,行数会对不上
#三个动作各管一件事
去重是删掉重复的行,排序是按行内容重新排列,反转是按原有位置颠倒过来 —— 三者不能互相替代,选错工具只会把数据搅得更乱。 它们的判断依据完全不同:
最常见的误用是拿反转去做倒序:想让日志最新的排在最前面,正确做法是用文本排序的降序,或者直接按时间列排;用字符反转会把每一行的内容也一起倒过来,得到一堆读不了的乱码。
整理前先用 文本统计 记下原始行数与字符数,整理完再统计一次。数字对得上,才能确认这轮操作只动了你想动的东西。
#去重:三个默认行为要先确认
文本去重默认按「整行完全一致」判断重复,大小写、行首行尾的空格、看不见的特殊字符都参与比较,所以 Apple 和 apple 在默认设置下是两行而不是一行。
它提供三个开关,分别对应三类不同的重复:
| 选项 | 打开后的效果 | 什么时候该开 |
|---|---|---|
| 忽略大小写 | Apple 与 apple 视为同一行 | 邮箱、域名、英文标签 |
| 去空白行 | 空行不进入结果 | 从网页或 PDF 粘贴后的清理 |
| 显示计数 | 标出每行出现次数 | 需要找出高频项时 |
结果保留每行首次出现的位置和写法,状态栏会告诉你去掉了多少行。
下面这三行看起来一样,实际是三行:第一行与第三行的行尾不同,第二行的大小写不同。
Apple
apple
Apple 正确的做法是先把大小写和空格统一,再去重:
apple
apple#排序:升序排的是字符,不是数值
文本排序的默认升序是字典序 —— 逐字符比较,先比第一个字符,相同再比第二个。因为字符 1 的编码小于 9,所以 10 会排在 9 前面。
这不是 bug,是字典序的定义。对比一下同一组文件名在两种模式下的结果:
字典序(默认升序)
file1.txt
file10.txt
file2.txt
file9.txt自然排序(数字感知)
file1.txt
file2.txt
file9.txt
file10.txt只要行里含有数字编号,就应该选自然排序。 版本号、章节目录、订单号、IP 列表都属于这一类。
判断当前是不是按数值排序,最快的办法是拿 9、10、100 三行试一次:10 排在 9 前面就是字典序,9 排在 10 前面就是自然排序。
#中文排序按编码值,不按拼音
中文字符没有大小写,升序时按字符的编码值比较,等价于 Unicode 码位顺序,所以结果看起来和拼音没有关系。 例如「阿」的码位小于「北」,即使拼音上 a 也小于 b,两者恰好一致,但换一组字就会分叉。
需要拼音顺序时,工具本身不会替你注音,可行的做法是给每行先加上一段拼音前缀(拼音列用 查找替换 拼进去),排完再把前缀去掉。反过来说,编码值排序是稳定且可复现的:同一份数据在任何机器上排出来的顺序都一样。
#大小写混排时的顺序
勾选忽略大小写之后,Apple、apple、APPLE 会被视为同一个键,先后顺序取决于它们各自在原文里的位置,而不是重新按大小写规则排。需要严格的大小写分组时,不要勾这一项。
#反转:先确认你要倒的是什么
文本反转提供字符反转、行反转、行内反转、单词反转四种模式,只有行反转会保持每一行内部的内容原样不变。
| 模式 | 效果 | 典型用途 |
|---|---|---|
| 字符反转 | 整段文字按字符从尾到头倒序 | 生成镜像文本、做简单混淆 |
| 行反转 | 颠倒所有行的先后顺序 | 日志倒着看,最新一行排最前 |
| 行内反转 | 每行内部字符倒序,行的顺序不变 | 分行处理的特殊场景 |
| 单词反转 | 单词顺序颠倒,单词本身不拆 | 英文句子级别的倒序 |
同一个输入在两种模式下的结果差别很大:
输入: 第 1 行 / 第 2 行 / 第 3 行
行反转: 第 3 行 / 第 2 行 / 第 1 行
字符反转:行 3 第 / 行 2 第 / 行 1 第中文字符与 emoji 会被当成完整字符处理。 这一点比看起来重要:用按 16 位单元倒序的简单算法处理 emoji 或部分生僻字时,会把一个字符拆成两半,输出成方块或乱码,而这个工具不会。
#什么时候该用哪个工具
| 你想做的事 | 用哪个 | 说明 |
|---|---|---|
| 删掉重复的邮箱、订单号 | 文本去重 | 需要时勾选忽略大小写 |
| 让文件名按数字顺序排列 | 文本排序 | 选自然排序模式 |
| 把日志按时间倒过来看 | 文本反转 | 用行反转,不要用字符反转 |
| 先看有多少行、多少字 | 文本统计 | 行数、字数、字符数分别给出 |
| 去掉行首行尾的空格 | 查找替换 | 精确字符串替换 |
| 批量处理不规则的空格 | 正则表达式测试 | 用正则匹配更灵活 |
| 把全角数字转成半角 | 全角半角转换 | 从 PDF 复制的文本常见 |
#常见问题
#去重之后原来的顺序会变吗?
不会。文本去重保留每行首次出现的位置和原始写法,输出顺序与输入顺序一致,只是删掉了后面重复的行。如果你希望结果按字母或数字排序,需要再去重之后单独用文本排序处理一次。
#排序后中文的顺序看起来是乱的,是坏了吗?
不是坏了,是编码值顺序与拼音顺序不一致。中文字没有大小写,升序按字符的编码值比较,所以「中」「国」「人」的先后取决于它们的码位,与读音无关。要按拼音排,需要先给每行补上拼音前缀,排完再去掉。
#反转之后中文或 emoji 变成了方块,是什么原因?
那是字符被拆开了。emoji 和部分生僻汉字在内部占两个 16 位单元,按单元倒序会把一个字符切成两半,显示成方块。文本反转做了中文与 emoji 的安全处理,按完整字符倒序;如果换成自己写脚本处理,需要按码位而不是按 16 位单元遍历。
#从 Excel 复制出来的一列,行首有多余空格,怎么先清掉?
用查找替换把开头的空格批量删掉,规则不固定时改用正则匹配行首的空白字符。清理完再用文本统计核对行数,确认没有整行被误删,最后才去去重 —— 顺序反了会把本该合并的行留成两行。
#几百上千行的数据,处理时会卡吗?会上传吗?
不会上传。三个工具都在浏览器本地完成,内容不经过服务器,可以放心处理手机号、邮箱这类清单。几千行的量级在这些操作上是瞬时完成的,只有在结果区域需要一次性渲染上万行时才会感觉到延迟。
#换行符不统一会导致什么问题?
换行符混用时行数可能对不上。Windows 文本用 CRLF、Linux 用 LF,而单独的一个回车符在部分编辑器里也被算作换行,于是同一份文件在不同工具里读出的行数不同,去重也会因为行尾多出的不可见字符而漏掉重复项。整理前统一换行符,或用文本统计先确认行数。