按字段排序怎么用
sort 默认按整行做字典序比较,处理结构化文本时需要指定字段与比较方式:-k 选择字段,-t 指定分隔符,字段后缀的修饰符决定比较规则,n 为数值、r 为逆序、f 忽略大小写、V 为版本号。关键细节是 -k2 与 -k2,2 的差别:前者表示从第 2 字段一路比较到行尾,后者只按第 2 字段比较。对含重复键的数据,两者的排序结果会有明显差异,报表类排序应当写完整的区间。
基本信息
| 适用平台 | Linux/macOS(GNU coreutils 与 BSD sort) |
|---|---|
| 命令语法 | sort -t分隔符 -k起始[,结束][修饰符] 文件 |
| 常用修饰符 | n 数值 r 逆序 f 忽略大小写 b 忽略前导空白 V 版本号 |
| 字段编号 | 从 1 开始计数,写 0 会报错 |
| 相关选项 | -u 去重 -s 稳定排序 -o 直接写输出文件 --parallel 并行排序 |
典型使用场景
- 按 UID 排序账号文件,检查编号分布是否合理
- 按数值列排序报表,例如耗时或金额
- 多字段排序:先按类型再按时间排列日志
- 处理 CSV:用 -t, 指定逗号分隔后再按列排序
- 结果落盘:用 -o 安全写出,避免重定向截断源文件
常用示例
常用示例
sort -t: -k3,3n /etc/passwd
sort -k2,2 -k1,1r data.txt # 先第 2 字段升序,再第 1 字段降序
sort -t, -k5,5nr app.log | head # 第 5 列数值降序
sort -t, -k2,2 -k3,3n data.csv
sort -t: -k3,3n /etc/passwd -o /tmp/passwd.sorted # -o 避免重定向截断
sort -k2,2 -u data.txt # 按第 2 字段去重字段写法语义
| 写法 | 含义 | 注意 |
|---|---|---|
| -k2 | 从第 2 字段比较到行尾 | 等价于按剩余整段比较,日志排序常用 |
| -k2,2 | 只按第 2 字段比较 | 语义清晰,报表排序推荐这样写 |
| -k2,2n | 第 2 字段按数值比较 | 需确认该列是纯数字或可解析为数字 |
| -k2,2r | 第 2 字段逆序 | 与 n 组合即 nr,形成数值降序 |
| -t | 指定分隔符 | 与默认空白分词互斥,多空格文本要先归一化 |
默认按空白分词,且与 -t 互斥:使用 -t 后连续空格不再被折叠。多空格对齐的文本建议先用 tr -s ' ' 归一化,或改用 awk 提取字段。
要直接写回原文件用 -o 参数,不要写 sort file > file。重定向在命令执行前截断文件,源数据会被清空。