shell小记之sort

1485阅读 0评论2012-03-02 suanmeilizhi
分类:LINUX

sort命令的一般格式为
  1. sort -cmu -o output_file [other options] +pos1 +pos2 input_files
sort命令的主要参数为:
-c : 测试文件是否分类
-m : 合并两个分类文件
-u : 删除所有复制行
-o : 存储sort结果的输出文件名
-b : 使用域进行分类时,忽略第一个空格
-n : 指定分类是域上的数字分类
-t : 指定域分隔符
-r :  对分类次序或者比较求逆
post1传递到m,n。m为为域号,n为开始分类字符数。
默认情况下,sort认为一个空格或者一系列空格为分隔符。缺省时,sort将整个行排序,指定域号的情况除外。

sort的k选项(摘自网络):
k选型要配合g选现才是按数据大小排序(默认按数据的第一个数字排序)
test文件如下:各域为:(1)名称,(2)供货区代码,(3)本季度租金,(4)本年租金
  1. Boys in Company C:HK:192:2192
  2. Alien:HK:119:1982
  3. The Hill:KL:63:2972
  4. Aliens:HK:532:4892
  5. Star Wars:HK:301:4102
  6. A Few Good Men:KL:445:5851
  7. Toy Story:HK:239:3972
若想按照名称排序:
  1. $ sort -k1 video.txt
看看K选项的格式:
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
这个语法被中间的都好分为Start和End两部分。,默认情况下,如果不设定End部分,End部分是被设为行尾的。Start部分也分为三部分,C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 1就是省略了C.Start的例子。FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。
所以,如果只想按照名称排序:
  1. $ sort -t: -k1,1 video.txt
-u选项和-k选项合用:
  1. $ cat video.txt
  2. Aliens:HK:532:4892
  3. Boys in Company C:HK:192:2192
  4. Alien:HK:119:1982
  5. The Hill:KL:63:2972
  6. Star Wars:HK:301:4102
  7. A Few Good Men:KL:445:5851
  8. Toy Story:HK:239:3972
  9. Alienss:HK:532:2
结果:
  1. $ sort -t: -n -k3,3 -u video.txt
  2. The Hill:KL:63:2972
  3. Alien:HK:119:1982
  4. Boys in Company C:HK:192:2192
  5. Toy Story:HK:239:3972
  6. Star Wars:HK:301:4102
  7. A Few Good Men:KL:445:5851
  8. Aliens:HK:532:4892
可以看到源文件的最后一行数据被删除了。-u选项只识别被-k设定的域,一旦相同,就删除。
看一个诡异的排序:
    1. $cat test
    2. google 110 5000
    3. baidu 100 5000
    4. guge 50 3000
    5. sohu 100 4500
    6. $sort -n -k 2.2,3.1 test
    7. guge 50 3000
    8. baidu 100 5000
    9. sohu 100 4500
    10. google 110 5000

以第二个域的第二个字符开始到第三个域的第一个字符结束的部分进行排序。

第一行,会提取0 3,第二行提取00 5,第三行提取00 4,第四行提取10 5。

又因为sort认为0小于00小于000小于0000….

因此0 3肯定是在第一个。10 5肯定是在最后一个。但为什么00 5却在00 4前面呢?(你可以自己做实验思考一下。)

答案揭晓:原来“跨域的设定是个假象”,sort只会比较第二个域的第二个字符到第二个域的最后一个字符的部分,而不会把第三个域的开头字符纳入比较范围。当发现00和00相同时,sort就会自动比较第一个域去了。当然baidu在sohu前面了。

有时候在sort命令后会看到+1 -2这样的符号,其实这种古老的方式已经淘汰了。


sort和head、tail连用,比如,如果只想知道最高租金:
  1. $ sort -t: -k4r video.txt | head -1
  2. A Few Good Men:KL:445:5851

利用sort将两个文件合并。将文件合并前,它们必须已经被分类。
上一篇:GDB调试技巧:调试复杂的宏定义
下一篇:linux free命令详解