sort 排序

sort 命令用于对文本行进行排序,支持数字排序、字典排序、逆序、按字段排序等。它经常与 uniq、head、tail 等命令配合使用,是数据分析的常用工具。

基本用法

默认按字典序排序:

sort file.txt

排序并输出到文件:

sort file.txt > sorted.txt
sort -o sorted.txt file.txt

-o 选项可以直接输出到原文件。

常用选项

选项含义
-n按数字排序
-r逆序排序
-u去除重复行
-f忽略大小写
-t指定分隔符
-k指定排序字段
-b忽略前导空白
-s稳定排序

数字排序

默认是字典序,数字排序需要 -n

echo -e "10\n2\n1\n20" | sort
echo -e "10\n2\n1\n20" | sort -n

运行结果:

1
10
2
20

1
2
10
20

字典序下,10 排在 2 前面,因为字符 "1" 比 "2" 小。

逆序排序

-r 逆序:

sort -r file.txt
sort -nr numbers.txt

按字段排序

-k 指定排序字段,-t 指定分隔符:

cat data.txt

内容示例:

张三 85
李四 92
王五 78

按第二列(分数)排序:

sort -k2 -n data.txt
sort -t' ' -k2 -n data.txt

运行结果:

王五 78
张三 85
李四 92

多字段排序

sort -t, -k1,1 -k2,2n data.csv

先按第一字段字典序排序,再按第二字段数字排序。

指定字段范围

sort -k2.3,2.5 file.txt

按第2字段的第3到第5个字符排序。

去除重复

-u 去除重复行:

sort -u file.txt

等同于 sort file.txt | uniq

忽略大小写

-f 忽略大小写:

echo -e "Apple\napple\nBanana\nbanana" | sort -f

检查是否已排序

-c 检查文件是否已排序:

sort -c file.txt
echo $?

如果已排序返回 0,否则返回 1 并输出第一个乱序的行。

合并已排序文件

-m 合并已排序的文件:

sort -m sorted1.txt sorted2.txt sorted3.txt

cat | sort 更高效,因为不需要重新排序。

实用示例

统计访问量前10的IP

cut -d' ' -f 1 access.log | sort | uniq -c | sort -rn | head -10

按文件大小排序

ls -l | sort -k5 -n
du -sh * | sort -h

-h 选项可以识别人类可读的大小格式(如 1K、2M、3G)。

按修改时间排序

ls -lt
ls -ltr

排序并去重

sort -u data.txt > unique.txt

按多列排序

sort -t, -k1,1 -k2,2n scores.csv

找出最大的文件

find . -type f -exec du -b {} + | sort -n | tail -10

性能优化

排序大文件时,可以调整缓冲区大小:

sort -S 512M largefile.txt
sort --parallel=4 largefile.txt

-S 设置内存缓冲区大小,--parallel 设置并行线程数。

小结

  • sort 用于对文本行进行排序
  • -n 数字排序,-r 逆序,-u 去重
  • -k 指定排序字段,-t 指定分隔符
  • -h 可以识别人类可读的大小格式
  • 常与 uniq、head、tail 配合使用