Linux中按指定字段倒序排序,核心命令为sort,结合-k指定字段、-r倒序选项实现,语法为sort -t分隔符 -k字段位置r 文件名,-t用于指定字段分隔符(如空格、冒号等),-k后接字段序号(从1开始),r表示降序,按/etc/passwd文件的第二字段(UID)倒序排序,可用sort -t: -k2r /etc/passwd`,此方法适用于日志分析、数据统计等场景,灵活处理结构化文本,高效实现多字段排序需求,是Linux文本处理的实用技巧。
在Linux日常运维和数据处理中,我们经常需要根据文本中的特定字段进行排序,例如分析日志时按时间倒序查看最新记录、统计数据时按数值大小降序排列等。sort命令是Linux中实现排序的核心工具,通过结合特定选项,可以轻松实现“按指定字段倒序排序”的需求,本文将详细介绍sort命令的相关用法,并通过实际示例帮助读者掌握这一技能。
核心命令:sort及其关键选项
sort命令用于对文本文件的行进行排序,默认按ASCII码顺序升序排列(即从a到z,从0到9),要实现“按指定字段倒序排序”,需结合以下核心选项:
-k选项:指定排序字段
-k(key)选项用于指定排序依据的字段,格式为-k[field_start][,field_end][options],

field_start:字段的起始位置(从1开始计数);field_end:字段的结束位置(省略时默认等于field_start,即只对当前字段排序);options:字段排序方式(如n按数值排序、r倒序等)。
-k3表示按第3个字段排序,-k2,3表示先按第2个字段排序,若相同再按第3个字段排序。
-r选项:倒序排列
-r(reverse)选项用于将排序结果反转,实现降序排列,默认sort是升序,加上-r即可变为倒序。
-n选项:按数值大小排序
默认情况下,sort按字符串的ASCII码顺序排序,例如数字“10”会排在“2”前面(因为ASCII码中'1'<'2'),若要按数值大小排序(即“10”>“2”),需使用-n(numeric)选项。
-t选项:指定字段分隔符
默认情况下,sort以空格或制表符(\t)作为字段分隔符,若数据以其他字符(如逗号、冒号)分隔,需用-t选项指定分隔符,例如-t,表示以逗号为分隔符。
基础示例:按单个字段倒序排序
假设有一个学生成绩文件score.txt如下(以空格分隔,格式为“姓名 科目 分数”):
Alice Math 95
Bob Physics 88
Charlie Chemistry 76
David Math 92
Eve Physics 85
需求1:按“分数”字段倒序排序(数值排序)
分数是数字,需按数值大小降序排列,命令如下:
sort -k3 -nr score.txt
输出结果:
Alice Math 95
David Math 92
Bob Physics 88
Eve Physics 85
Charlie Chemistry 76
说明:-k3指定按第3个字段(分数)排序,-n按数值排序,-r倒序,因此分数从高到低排列。
需求2:按“科目”字段倒序排序(字符串排序)
若按科目名称降序排列(字符串比较),命令如下:
sort -k2 -r score.txt
输出结果:
Charlie Chemistry 76
Alice Math 95
David Math 92
Bob Physics 88
Eve Physics 85
说明:-k2指定按第2个字段(科目)排序,-r倒序,因此科目按字母降序排列(Chemistry > Math > Physics)。
进阶示例:自定义分隔符与多字段排序
自定义分隔符(以逗号分隔的CSV文件)
假设有一个CSV格式的销售数据文件sales.csv如下(以逗号分隔,格式为“产品,地区,销售额”):
Laptop,East,50000
Phone,West,30000
Tablet,East,45000
Desktop,South,60000
Phone,East,35000
需求:按“销售额”字段倒序排序
需先指定逗号为分隔符(-t,),再按第3个字段数值倒序排序:
sort -t, -k3 -nr sales.csv
输出结果:
Desktop,South,60000
Laptop,East,50000
Tablet,East,45000
Phone,East,35000
Phone,West,30000
多字段排序(先按地区升序,再按销售额降序)
若希望先按地区(第2个字段)升序排列,相同地区内再按销售额(第3个字段)降序排列,需结合-k选项的复合写法:
sort -t, -k2 -k3nr sales.csv
输出结果:
Phone,East,35000
Laptop,East,50000
Tablet,East,45000
Desktop,South,600 
