小Q:你喜欢花,却不愿意种花,你说因为喜欢所以不想看到她一点一点凋落;是的,为了避免结束,你避免了一切开始。
===========================================================
一:简介
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
二:格式+选项
#sort command file
-u 作用很简单,就是在输出行中去除重复行uniq。
-r sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了
-n sort时常将数字按字符来排序了,所以就会将10放在2前面喽。-n是以数字排序
-t和-k 时常连用,-t指定分隔符,-k指定第几列
-o 由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,但如果想把
排序结果输出到原文件中,用重定向就不行了。 需要 sort -r number.txt -o number.txt
-f 会将小写字母都转换为大写字母来进行比较,亦即忽略大小写
-c 会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1
-C 会检查文件是否已排好序,如果乱序,不输出内容,仅返回1
-M 会以月份来排序,比如JAN小于FEB等等
-b 会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符
三:实例应用
cat file google 110 5000 baidu 100 5000 guge 50 3000 sohu 100 4500
1. 我想让这个文件按公司的字母顺序排序,也就是按第一个域进行排序:(这个file文件有三个域)
# sort -t ‘ ‘ -k 1 file
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500
2. 我想让file按照公司人数排序 ,人数相同的按照员工平均工资升序排序:
# sort -n -t ‘ ‘ -k 2 -k 3 file
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000
3. 我想让file按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序(有点难度喽)
# sort -n -t ‘ ‘ -k 3r -k 2 file
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
==#sort -t ‘ ‘ -k 3nr -k 2n file
4. 只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序(虽然现在只有三列):
# sort -t ' ' -k 1.2,1.2 -nrk 3,3 file
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
-k 1.2,1.2表示“只”根据第一列第二个字母排序;-k 3,3 是最准确的表述,表示我们“只”对本域进行排序,因为如果你省略了后面的3,就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了;使用 -k 1.2 不行,因为这样省略了End部分
------------------------------------------------------------------------------------------------------
5.# sort -n -k 2 file
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
# sort -n -k 2 -u file
guge 50 3000
baidu 100 5000
google 110 5000
-u只识别用-k设定的域
# sort -k 1.1,1.1 -u file
baidu 100 5000
google 110 5000
sohu 100 4500
# sort -n -k 2 -k 3 -u file
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000
这样就删不了了,因为-u会去权衡所有-k的选项
-----------------------------------------------------------------------------------------------------
附加题一:最诡异的排序:
# sort -n -k 2.2,3.1 file
guge 50 3000
baidu 100 5000
sohu 100 4500
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 -n -k 2.2,3.1 -k 1,1r file
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000
附加题二:有时候在sort命令后会看到+1 -2这些符号,这是什么东东?
关于这种语法,最新的sort是这么进行解释的:
On older systems, `sort’ supports an obsolete origin-zero syntax `+POS1 [-POS2]‘ for specifying sort keys. POSIX 1003.1-2001 (*note Standards conformance::) does not allow this; use `-k’ instead.
原来,这种古老的表示方式已经被淘汰了,以后可以理直气壮的鄙视使用这种表示方法的脚本喽!
(为了防止古老脚本的存在,在这再说一下这种表示方法,加号表示Start部分,减号表示End部分。最最重要的一点是,这种方式方法是从0开始计数的,以前所说的第一个域,在此被表示为第0个域。以前的第2个字符,在此表示为第1个字符。明白?)