sort 函数高级使用

2021-08-09 11:29:39 浏览数 (1)

sort

  • -u: 删除后面的重复项
代码语言:javascript复制
 [rocrocket@rocrocket programming]$ sort seq.txt
 apple
 banana
 orange
 pear
 pear
 [rocrocket@rocrocket programming]$ sort -u seq.txt
 apple
 banana
 orange
 pear
  • -r: 默认是升序, 可改为降序;
  • -o: 将排序后的结果写入原文件, 否则 默认是清空原文件的
代码语言:javascript复制
 sort -r number.txt -o number.txt
  • -n: 按照数字排序, 否则 10 会比2 小 【默认是字典序】
  • -t: 指定分隔符
代码语言:javascript复制
 [rocrocket@rocrocket programming]$ sort -n -k 2 -t : facebook.txt
 apple:10:2.5
 orange:20:3.4
 banana:30:5.5
 pear:90:2.3

1: 第三列降序排列; 若第三列相同,则第二列 升序排列。

代码语言:javascript复制
 $ sort -n -t ' ' -k 3r -k 2 facebook.txt
 baidu 100 5000
 google 110 5000
 sohu 100 4500
 guge 50 3000

2: 从第一个域的 第二个字符 开始排序:

代码语言:javascript复制
 $ sort -t  ' '  -k 1.2 facebook.txt
 baidu 100 5000
 sohu 100 4500
 google 110 5000
 guge 50 3000

3: 只根据第二个字符排序。

代码语言:javascript复制
 $ sort -t ‘ ‘ -k 1.2,1.2 -k 3,3nr facebook.txt
 baidu 100 5000
 google 110 5000
 sohu 100 4500
 guge 50 3000

4: 注意: 跨域,只会比较第一个域

代码语言:javascript复制
 $ sort -n -k 2.2,3.1 facebook.txt
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前面了。用一个范例即可证实:

代码语言:javascript复制
 # 第二个域升序,(第三个域无效),
 # 第一个域的第一个字符 降序排列
 $ sort -n -k 2.2,3.1 -k 1,1r facebook.txt
 guge 50 3000
 sohu 100 4500
 baidu 100 5000
 google 110 5000

其它选项

-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

-M会以月份来排序,比如JAN小于FEB等等

-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

0 人点赞