1. 程式人生 > >shell學習(5)- sort

shell學習(5)- sort

Linux sort命令用於將文字檔案內容加以排序。

sort可針對文字檔案的內容,以行為單位來排序。

引數如下:

-b 忽略每行前面開始出的空格字元。
-c 檢查檔案是否已經按照順序排序。
-d 排序時,處理英文字母、數字及空格字元外,忽略其他的字元。
-f 排序時,將小寫字母視為大寫字母。
-i 排序時,除了040至176之間的ASCII字元外,忽略其他的字元。
-m 將幾個排序好的檔案進行合併。
-M 將前面3個字母依照月份的縮寫進行排序。
-n 依照數值的大小排序。
-o<輸出檔案> 將排序後的結果存入指定的檔案。
-r 以相反的順序來排序。
-k 指定以哪一列來排序。
-u 去重。
-t<分隔字元> 指定排序時所用的欄位分隔字元。 +<起始欄位>-<結束欄位> 以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。 --help 顯示幫助。 --version 顯示版本資訊。

1.sort直接用就可以對檔案進行排序

準備測試檔案
[[email protected] ~]$ cat sorttest.txt
hello
java
php
world
betty
php

[[email protected] ~]$ sort sorttest.txt
betty
hello
java
php
php
world

2.sort -u的選項是去重,在輸出行中去除重複行

[[email protected] ~]$ sort -u sorttest.txt
betty
hello
java
php
world

3.sort -n 選項是按照數值大小排序,這樣就不會出現10出現在2之前了

準備個檔案
[[email protected] ~]$ cat num.txt
8
9
1
2
10
20

如果直接排序,結果如下
[[email protected] ~]$ sort num.txt
1
10
2
20
8
9

要想按照數值大小排序,需要加-n選項
[
[email protected]
~]$ sort -n num.txt 1 2 8 9 10 20

4.sort -o 選項把結果輸出到指定檔案中,用重定向命令也是可以的

[[email protected] ~]$ sort -n -o test num.txt
[[email protected] ~]$ cat test
1
2
8
9
10
20

或者直接如下
[[email protected] ~]$ sort -n num.txt  > test
[[email protected] ~]$ cat test
1
2
8
9
10
20

5.sort的-t選項指定分隔符

這個檔案有三列,列與列之間用“-”隔開了,第一列表示年,第二列表示月,第三列表示日。那麼我想以月來排序,也就是以第二列來排序,如何利用sort實現?幸好,sort提供了-t選項,後面可以設定間隔符。指定了間隔符之後,就可以用-k來指定列數了。

準備檔案
[[email protected] ~]$ cat date
2018-12-22
2016-11-11
2017-04-11
2019-08-07

如果直接排序的話,結果如下
[[email protected] ~]$ sort date
2016-11-11
2017-04-11
2018-12-22
2019-08-07

如果以第二列月份排序的話,如下
[[email protected] ~]$ sort -n -k2 -t'-' date
2017-04-11
2019-08-07
2016-11-11
2018-12-22

6.sort -k選項是指定以哪一列來排序

準備測試檔案如下
[[email protected] ~]$ cat company
facebook 50 5000
alibaba 100 3000
tengxun 80 4000
baidu 150 2000
google 200 1000

如果直接排序,是以第一列的字母排序
[[email protected] ~]$ sort company
alibaba 100 3000
baidu 150 2000
facebook 50 5000
google 200 1000
tengxun 80 4000

第一列排序還可以指定第一列
[[email protected] ~]$ sort -k1 company
alibaba 100 3000
baidu 150 2000
facebook 50 5000
google 200 1000
tengxun 80 4000
[[email protected] ~]$ sort -k1 -t' ' company
alibaba 100 3000
baidu 150 2000
facebook 50 5000
google 200 1000
tengxun 80 4000

如果以第二列數值大小排序
[[email protected] ~]$ sort -k2n -t' ' company
facebook 50 5000
tengxun 80 4000
alibaba 100 3000
baidu 150 2000
google 200 1000

改下檔案,如果第二列相同,按第三列大小排序,如何操作?

[[email protected] ~]$ cat company
facebook 50 5000
alibaba 50 3000
tengxun 80 4000
baidu 150 2000
google 200 1000

[[email protected] ~]$ sort -k2n -t' ' -k3n company
alibaba 50 3000
facebook 50 5000
tengxun 80 4000
baidu 150 2000
google 200 1000

如果第二列相同,第三列降序排序,如何操作呢?

[[email protected] ~]$ sort -k2n -t' ' -k3nr company
facebook 50 5000
alibaba 50 3000
tengxun 80 4000
baidu 150 2000
google 200 1000

如果-k 和 -u 聯合使用,有什麼效果呢?

[[email protected] ~]$ sort -n -k2 company
alibaba 50 3000
facebook 50 5000
tengxun 80 4000
baidu 150 2000
google 200 1000

[[email protected] ~]$ sort -n -k2  -u company
facebook 50 5000
tengxun 80 4000
baidu 150 2000
google 200 1000

發現第二列相同的alibaba刪除掉了

7.sort -M選項,按月份的前三個縮寫字母來排序

[[email protected] ~]$ cat month
DEC
JAN
NOV
AUG
MAY

[[email protected] ~]$ sort -M month
JAN
MAY
AUG
NOV
DEC

8.sort -r選項是逆序排列

[[email protected] ~]$ cat sorttest.txt
hello
java
php
world
betty
php

[[email protected] ~]$ sort -r  sorttest.txt
world
php
php
java
hello
betty