使用Sort 对文件排序详解

当我们处理 大量数据时,linux有个常用命令sort,对数据默认进行字符排序,然后标准输出。

  1. sort 命令原理
 默认情况下,sort命令将文件每一行作为进行比较,排序规则:从第一个字符向后,依次按照ASCII码值进行比较,然后依次输出。


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


并没有按照数字大小来排序

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


  1.  sort -M  按月排序     
分析日志文件时,开头经常有个时间戳,sort -M 可以实现按照月份来排序。

  1.  sort常用参数
-n     按照字符数值来比较
-M    按照月份比较
-f      忽略字母大小写,默认情况下,会将大写字母排在前面
-r      按照降序排列
-k     --key=post1,[post2]       按照指定范围比较,从post1 位置开始,如果制定了post2,到post2 位置结束
-t     指定一个用来区分键位值得字符来比较 
-b    忽略每一行前的所有空白字符,从第一个可见字符比较。

例如:  将 /etc/password 文件根据用户ID值大小进行数值排序
   可以用-k 和-t 实现按字段分隔的数据进行排序,用-k 参数指定定位分隔符 ":",用-t 参数指定排序的字段,及 列数



  1.   -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


  1.   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。
 
  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值