当我们处理
大量数据时,linux有个常用命令sort,对数据默认进行字符排序,然后标准输出。
- sort 命令原理
默认情况下,sort命令将文件每一行作为进行比较,排序规则:从第一个字符向后,依次按照ASCII码值进行比较,然后依次输出。

看上去似乎很简单,但是当排序数字时:

并没有按照数字大小来排序
- sort -n 数字排序
默认情况下,sort将数字当做字符而执行标准字符排序,不是按照大小来排序。实现按照大小排序,需要-n 参数

- sort -M 按月排序
分析日志文件时,开头经常有个时间戳,sort -M 可以实现按照月份来排序。
- sort常用参数
-n 按照字符数值来比较
-M 按照月份比较
-f 忽略字母大小写,默认情况下,会将大写字母排在前面
-r 按照降序排列
-k --key=post1,[post2] 按照指定范围比较,从post1 位置开始,如果制定了post2,到post2 位置结束
-t 指定一个用来区分键位值得字符来比较
-b 忽略每一行前的所有空白字符,从第一个可见字符比较。
例如: 将 /etc/password 文件根据用户ID值大小进行数值排序
可以用-k 和-t 实现按字段分隔的数据进行排序,用-k 参数指定定位分隔符 ":",用-t 参数指定排序的字段,及
列数!

- -K 参数扩展
当我们编写shell 脚本是,经常会用到sort -k 一些参数,已下面例子具体说明:

第一列:姓名 第二列:身高 第三列:年龄 第四列:工资
a. 若要将上面文件中,按照员工姓名进行排序

按照姓名,第一个区域进行比较即可,-k 1,直接得到结果
b.
若要按照身高来比较,进行排序。

按照身高,数字要加-n,第二个区域比较即可, -k 2,但是lisi 和wangwu 身高一样,这时默认会按照第一区域进行比较,所以lisi在前。
C.
若按照身高进行排序,身高相同的员工按照工资升序排序。

按照身高和工资,这样设定了区域, 加入 -k2 -k4 ,从第2个区域开始比较,如果相同,再以第4个区域排序。(若需要,可以一直在后面加上区域)。
d. 若要按照员工工资降序排列,工资相同的以年龄升序排列。

先比较工资,要先比较第四个区域,另外要降序,则是 -k4r 在前, 再比较年龄,-k2 ,默认升序,所以为 -k4r -k2.
因为比较的都是数字,所以 -n 参数前置,还可以写成:
sort -t ‘ ’ -k4rn -k3n sort-test1

- sort -k参数扩展二
了解-k选项的语法格式,如下:
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。
如果不设定End部分,那么就认为End被设定为行尾。
FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。
a. 按照姓名的第二个字母排序:
-k1.2 ,比较的第一个区域的第2个字母开始,到本区域的最好一个字符结束,来进行比较。故zhangsan 和zhaoxiaoliu ,n在o的前面,所以zhangsan排在前面。
b. 按照姓名的第二个字母排序,如果相同的则按照工资进行降序排列:

因为限定了姓名第二个字母的比较范围,因此第一区域必须FStart和CStar 指定,及-k1.2,1.2 ,再比较工资第四个区域,数字逆序排列,故为-k4nr。