sort默认按ASCII字符逐位比较,故10排在2前;需加-n按数值排序,配合-t、-k指定字段,-b忽略前导空格,-u去重,-o安全写回原文件。

默认直接跑 sort file.txt 很可能得到“错”的结果——不是命令坏了,而是它根本没按你心里想的数字或字段在排。
为什么 sort 排出来的数字顺序看起来乱?
因为 sort 默认按 ASCII 字符逐位比对,不是算数值大小。比如 10 开头是 '1',2 开头是 '2',所以 10 一定排在 2 前面。
- 现象:
echo -e "10\n2\n100" | sort输出是10、100、2 - 解决:加
-n强制数值排序 ——sort -n file.txt - 注意:
-n对含字母的行(如user:42)会失效,必须配合-t和-k指定字段
按某一列排序(比如 CSV 的第二列、空格分隔的第三字段)
关键靠 -t 定分隔符、-k 定字段范围。字段编号从 1 开始,-k 2,2 表示“只用第 2 列”,-k 2 表示“从第 2 列到行尾都参与比较”。
- CSV 文件
grades.csv内容为Alice,90、Bob,78,按分数升序:sort -t',' -k2,2n grades.csv - 空格分隔的
users.log(alice 35 engineer),按年龄降序:sort -k2,2nr users.log - 字段开头有空格?加
-b忽略前导空白:sort -b -k3,3n data.txt
去重、合并、写回原文件这些操作怎么才不丢数据?
-u 不是“全局去重开关”,它只删相邻重复行;> file.txt 直接重定向会清空原文件再读,导致数据丢失。
- 安全去重:先
sort再-u,sort -u input.txt或sort input.txt | uniq - 写回原文件必须用
-o:sort -n data.txt -o data.txt—— 这个选项内部会用临时文件,安全 - 合并多个已排好序的文件(不重新排序):
sort -m file1.txt file2.txt
最容易被忽略的是字段边界和排序逻辑的耦合:不写 -k 2,2 而只写 -k 2,后面字段会悄悄参与比较;不加 -n 却指望数值顺序,结果永远“不对”。实际动手前,先 head -n5 data.txt 看清楚分隔符、空格、字段位置,再决定要不要 -t、-b、-k 组合。


















