极简工具箱

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

按行排序:字典序、数值序与中文排序的差异

`10` 排在 `9` 前面,因为按字符串比较时 `1` < `9`。文本排序的第一个决策,是「按字符比还是按数值比」。

广告位(百度联盟)

一、字典序 vs 数值序

字典序(按字符逐位比较):
1
10
2
20
3

数值序:
1
2
3
10
20

字典序比较的是字符编码,10 的第一位 1 小于 2,所以排在前面。这对「编号、版本号、金额」往往是错的。

判断标准:这一列是不是「数字」?是就用数值序,否则用字典序。

二、大小写与符号

ASCII 里大写字母排在小写前面(A=65,a=97),所以:

Apple
Banana
apple
banana

不区分大小写时会变成 Apple, apple, Banana, banana(按字母序交错)。需要哪种取决于用途:

三、中文怎么排

三种常见规则:

规则依据特点
拼音汉字转拼音后比较符合日常习惯,最常用
笔画笔画数 + 笔顺字典、名册常用
编码Unicode 码点实现简单,但顺序对人无意义

Unicode 码点排序下,常用汉字大致按部首/笔画分布,但不等于拼音序,直接排出来的名单看起来很乱。做中文名单排序要用支持 locale 的比较(如 Python 的 locale.strxfrm、JS 的 localeCompare('zh-CN'))。

四、排序 + 去重

两步的顺序会影响结果:

如果原始顺序有意义(按时间、按优先级),应选择「保序去重」且不排序。

五、按某一列排序

处理 name,age,city 这样的数据时,需要指定「按第几列、什么类型」:

# 按第 2 列数值排序(-t 指定分隔符,-k 指定列)
sort -t',' -k2,2n data.csv

# 按第 1 列字符串排序
sort -t',' -k1,1 data.csv

-n 是数值,-r 倒序,-f 忽略大小写,-u 去重。注意 -k2,2n 里的 ,2 表示「只按第 2 列」,不写会从第 2 列一直比到行尾。

六、排序「不稳定」的错觉

同样的输入,两次排序结果不同,通常是因为:

处理:先清洗(trim、去 \r、统一全半角),再排序;需要稳定结果时,加上第二排序键(如整行)作为兜底。

七、几个实际场景

八、工具

用 文本去重排序 可以按行去重、排序(支持忽略大小写、去首尾空白);对比排序前后的差异用 文本对比;核对行数变化用 字数统计。

小结

数字列用数值序,否则字典序会把 10 排在 9 前面;中文按拼音排要用 locale 比较;排序前去空白与不可见字符;需要原始顺序就别排序,用保序去重。

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

更多使用教程