因为sort默认按ascii码逐字符比较,“10”首字符'1'的ascii值小于“2”首字符'2',故"10"排在"2"前面。

默认排序为什么 10 排在 2 前面?
因为 sort 默认按字符(ASCII)逐字比较,不是按数字大小。字符串 "10" 开头是 '1',"2" 开头是 '2',而 '1' '2',所以 "10 apple" 会排在 "2 banana" 前面——这在处理版本号、端口号、ID 列时极易出错。
- 用
-n强制数值排序:sort -n file.txt - 只对某列数值排序(比如第 2 列),必须加
-k和-n组合:sort -k2n file.txt - 如果该列开头有空格,记得加
-b忽略前导空白:sort -b -k2n file.txt
按多列排序:先按部门再按薪资降序
真实日志或表格数据常需“主次排序”,比如先按字符串字段升序(如部门名),再按数字字段降序(如薪资)。这时不能只写一个 -k,得链式指定,且顺序即优先级。
-
-k1,1表示“只取第 1 列完整内容”(避免跨到第 2 列) -
-k3nr,3表示“第 3 列数值降序”,r在n后面才生效 - 完整命令:
sort -t"," -k1,1 -k3nr,3 data.csv(假设用逗号分隔) - 漏掉
,1或,3可能导致排序范围扩大到行尾,结果错乱
去重(-u)必须配合排序,否则无效
sort -u 看似简单,但 -u 的逻辑是“相邻重复行才去重”。如果文件本身无序,-u 只会删掉连续出现的重复项,漏掉分散的重复行。
- 正确姿势永远是先排好序再
-u:sort file.txt | sort -u或直接sort -u file.txt(sort内部已隐含排序) - 若想按某列去重(如只保留每种用户名的第一条记录),得先按该列排序,再
-u:sort -k1,1 file.txt | sort -k1,1 -u - 更安全的做法是显式用
-k控制去重键:sort -k1,1 -u file.txt
月份字段(Jan/Feb)怎么排不出顺序?
直接 sort -k3 对 "Oct 1"、"Jan 4" 这类文本排序,结果是字母序(Apr, Aug, Dec…),不是时间序。Linux 提供了专用参数解决这个问题。
- 用
-M参数识别英文月份缩写:sort -k2M file.txt(假设第 2 列是Jan/Oct) -
-M只作用于单个字段,且只认标准三字母缩写(Jan,Feb…Dec),不支持中文或全称 - 如果字段混着日期(如
"Oct 1"),建议先用awk或cut提取纯月份列,再-k -M排序
-k 的位置和修饰符顺序(如 n、r、M)必须紧贴对应字段,错一位就可能整个排序逻辑失效。










