sort命令
sort命令是在Linux裏非常有用,它將文件進行排序,並將排序結果標準輸出。sort命令既可以從特定的文件,也可以從stdin中獲取輸入。
語法
sort(選項)(參數)
選項
-b:忽略每行前面開始出的空格字符; -c:檢查文件是否已經按照順序排序; -d:排序時,處理英文字母、數字及空格字符外,忽略其他的字符; -f:排序時,將小寫字母視爲大寫字母; -i:排序時,除了040至176之間的ASCII字符外,忽略其他的字符; -m:將幾個排序號的文件進行合併; -M:將前面3個字母依照月份的縮寫進行排序; -n:依照數值的大小排序; -o<輸出文件>:將排序後的結果存入制定的文件; -r:以相反的順序來排序; -t<分隔字符>:指定排序時所用的欄位分隔字符; +<起始欄位>-<結束欄位>:以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。
參數
文件:指定待排序的文件列表。
實例
sort將文件/文本的每一行作爲一個單位,相互比較,比較原則是從首字符向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。
[root@mail text]# cat sort.txt aaa:10:1.1 ccc:30:3.3 ddd:40:4.4 bbb:20:2.2 eee:50:5.5 eee:50:5.5 [root@mail text]# sort sort.txt aaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5 eee:50:5.5
忽略相同行使用-u選項或者uniq:
[root@mail text]# cat sort.txt aaa:10:1.1 ccc:30:3.3 ddd:40:4.4 bbb:20:2.2 eee:50:5.5 eee:50:5.5 [root@mail text]# sort -u sort.txt aaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5 或者 [root@mail text]# uniq sort.txt aaa:10:1.1 ccc:30:3.3 ddd:40:4.4 bbb:20:2.2 eee:50:5.5
sort的-n、-r、-k、-t選項的使用:
[root@mail text]# cat sort.txt AAA:BB:CC aaa:30:1.6 ccc:50:3.3 ddd:20:4.2 bbb:10:2.5 eee:40:5.4 eee:60:5.1 #將BB列按照數字從小到大順序排列: [root@mail text]# sort -nk 2 -t: sort.txt AAA:BB:CC bbb:10:2.5 ddd:20:4.2 aaa:30:1.6 eee:40:5.4 ccc:50:3.3 eee:60:5.1 #將CC列數字從大到小順序排列: [root@mail text]# sort -nrk 3 -t: sort.txt eee:40:5.4 eee:60:5.1 ddd:20:4.2 ccc:50:3.3 bbb:10:2.5 aaa:30:1.6 AAA:BB:CC # -n是按照數字大小排序,-r是以相反順序,-k是指定需要愛排序的欄位,-t指定欄位分隔符爲冒號
-k選項的具體語法格式:
-k選項的語法格式:
FStart.CStart Modifie,FEnd.CEnd Modifier -------Start--------,-------End-------- FStart.CStart 選項 , FEnd.CEnd 選項
這個語法格式可以被其中的逗號,
分爲兩大部分,Start部分和End部分。Start部分也由三部分組成,其中的Modifier部分就是我們之前說過的類似n和r的選項部分。我們重點說說Start
部分的FStart
和C.Start
。C.Start
也是可以省略的,省略的話就表示從本域的開頭部分開始。FStart.CStart
,其中FStart
就是表示使用的域,而CStart
則表示在FStart
域中從第幾個字符開始算“排序首字符”。同理,在End部分中,你可以設定FEnd.CEnd
,如果你省略.CEnd
,則表示結尾到“域尾”,即本域的最後一個字符。或者,如果你將CEnd設定爲0(零),也是表示結尾到“域尾”。
從公司英文名稱的第二個字母開始進行排序:
$ sort -t ' ' -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000
使用了-k 1.2
,表示對第一個域的第二個字符開始到本域的最後一個字符爲止的字符串進行排序。你會發現baidu因爲第二個字母是a而名列榜首。sohu和 google第二個字符都是o,但sohu的h在google的o前面,所以兩者分別排在第二和第三。guge只能屈居第四了。
只針對公司英文名稱的第二個字母進行排序,如果相同的按照員工工資進行降序排序:
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt baidu 100 5000 google 110 5000 sohu 100 4500 guge 50 3000
由於只對第二個字母進行排序,所以我們使用了-k 1.2,1.2
的表示方式,表示我們“只”對第二個字母進行排序。(如果你問“我使用-k 1.2
怎麼不行?”,當然不行,因爲你省略了End部分,這就意味着你將對從第二個字母起到本域最後一個字符爲止的字符串進行排序)。對於員工工資進行排 序,我們也使用了-k 3,3
,這是最準確的表述,表示我們“只”對本域進行排序,因爲如果你省略了後面的3,就變成了我們“對第3個域開始到最後一個域位置的內容進行排序” 了。