sort命令是Linux/Unix系统中用于对文本文件内容进行排序的核心工具,它能够根据字符顺序、数字大小、字段位置等规则对文本行重新排列,默认按ASCII码升序排序,输出至标准输出或指定文件,以下从常用选项、功能场景及示例展开说明。
常用选项及功能
sort命令通过选项实现多样化排序需求,核心选项如下表所示:
选项 | 功能描述 | 示例 |
---|---|---|
-f |
忽略大小写,将所有字母视为小写 | sort -f file.txt (将”Apple”和”apple”视为相同) |
-n |
按数字值排序,而非字符顺序(适用于纯数字或数字开头的行) | sort -n numbers.txt (将”10″排在”2″前,而非按字符’1′<‘2’) |
-r |
反向排序,降序输出(默认升序) | sort -r file.txt (从”z”到”a”排序) |
-k |
指定字段排序,支持多字段(-k起始列,结束列 ) |
sort -k2,2 file.txt (按每行第二列排序) |
-t |
指定字段分隔符(默认为空白字符) | sort -t',' -k2,2 data.csv (按CSV文件的第二列排序) |
-u |
去重,仅保留唯一行(需先排序,否则仅去重相邻行) | sort -u file.txt (重复行仅保留一行) |
-o |
将结果输出至指定文件(覆盖原文件) | sort -o output.txt input.txt |
-m |
合并多个已排序文件(要求输入文件本身已排序) | sort -m file1.txt file2.txt |
-b |
忽略行首空白字符(如空格、制表符) | sort -b file.txt (避免前导空白影响排序) |
功能场景及示例
基础文本排序
默认按ASCII码升序排序,字母顺序为A-Z、a-z(小写字母ASCII码大于大写)。
示例:
假设file.txt
内容为:
banana
Apple
cherry
apple
执行sort file.txt
,输出:
Apple
apple
banana
cherry
若需忽略大小写,加-f
选项:sort -f file.txt
,输出:
Apple
apple
banana
cherry
数字排序
直接排序数字文本时,会按字符顺序(如”10″排在”2″前,因’1′<‘2’),需用-n
选项按数值大小排序。
示例:numbers.txt
内容为:
10
2
1
20
执行sort -n numbers.txt
,输出:
1
2
10
20
按字段排序
处理结构化文本(如日志、CSV)时,可通过-k
指定字段,-t
指定分隔符。
示例:data.csv
内容为(以逗号分隔):
1001,zhangsan,25
1002,lisi,30
1001,wangwu,20
按第三列(年龄)升序排序:sort -t',' -k3,3n data.csv
,输出:
1001,wangwu,20
1001,zhangsan,25
1002,lisi,30
若需先按第二列(姓名)升序,再按第三列降序:sort -t',' -k2,2 -k3,3rn data.csv
,输出:
1001,wangwu,20
1002,lisi,30
1001,zhangsan,25
去重与合并
-u
选项需结合排序使用,否则仅去重相邻重复行;-m
用于合并多个已排序文件。
示例:file1.txt
内容(已排序):ancne
,file2.txt
内容(已排序):bdf
,执行sort -m file1.txt file2.txt
,输出:abcdef
。
相关问答FAQs
问题1:sort命令和uniq命令在去重时有什么区别?
解答:sort命令的-u
选项会在排序过程中直接去除重复行(无论是否相邻),但要求输入文件是未排序的或已排序的;而uniq命令仅能去除相邻的重复行,若文件未排序,需先用sort排序再用uniq才能正确去重(即sort file.txt | uniq
)。
问题2:如何实现先按第二列降序,再按第三列升序排序?
解答:使用-k
选项指定多字段,结合-r
实现降序,对以制表符分隔的文件,按第二列降序、第三列升序排序:sort -t$'t' -k2,2r -k3,3n file.txt
,其中-t$'t'
指定制表符为分隔符,-k2,2r
表示第二列降序,-k3,3n
表示第三列升序(n
表示数字排序,若为文本则省略n
)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/14222.html