sort(分類)用法

1.sort(分類)用法

sort命令選項很長,下面僅介紹各種選項。
sort命令的一般格式爲:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files 

下面簡要介紹一下sort的參數:
-c 測試文件是否已經分類。
-m 合併兩個分類文件。
-u 刪除所有複製行。
-o 存儲s o r t結果的輸出文件名。

其他選項有:
-b 使用域進行分類時,忽略第一個空格。
-n 指定分類是域上的數字分類。
-t 域分隔符;用非空格或t a b鍵分隔域。
-r 對分類次序或比較求逆。
+n n爲域號。使用此域號開始分類。
n n爲域號。在分類比較時忽略此域,一般與+n一起使用。
post1 傳遞到m,n。m爲域號,n爲開始分類字符數;例如4,6意即以第5域分類,從第7個字符開始。

保存輸出
- o選項保存分類結果,然而也可以使用重定向方法保存。下面例子保存結果到results.out:
$sort video >results.out

2.例子說明
=========================================
下面是文件video的清單,包含了上個季度家電商場的租金情況。各域爲:
(1)名稱,(2)供貨區代碼,(3)本季度租金,(4)本年租金。

域分隔符爲冒號,爲此對此例需使用‘-t’選項。文件如下:
[root@Linuxsvr lab]# cat video
Boys in Company C       :HK     :192    :2192
Alien                   :HK     :119    :1982
The Hill                :KL     :63     :2972
Aliens                  :HK     :532    :4892
Star Wars            :HK     :301    :4102
A Few Good Men :KL     :445    :5851
Toy Story             :HK     :239    :3972

=========================================

3.啓動方式
缺省情況下,sort認爲“一個空格”或“一系列空格”爲“分隔符”。要加入其他方式分隔,使用-t(-t+分隔符)選項,如:
[root@Linuxsvr lab]# sort -t: video
A Few Good Men          :KL     :445    :5851
Alien                   :HK     :119    :1982
Aliens                  :HK     :532    :4892
Boys in Company C       :HK     :192    :2192
Star Wars               :HK     :301    :4102
The Hill                :KL     :63     :2972
Toy Story               :HK     :239    :3972

以“:”爲分隔符,按照第一列排序

4.
先查看是否爲域分隔設置了- t選項,如果設置了- t選項,則使用分隔符將記錄分隔成 域0、域1、域2、域3等等;
如果未設置- t選項,用空格代替。
缺省時sort以每行第一個字符將整個行排序,也可以指定域號,這樣就會按照指定的域優先進行排序,
如果指定的域有重複,會參考下一個域。

sort對域的參照方式:
關於sort的一個重要事實是它參照第一個域作爲域0,域1是第二個域,等等。sort也可以使用整行作爲分類依據。

=========================================
第一個域             第二個域 第三個域  第四個域
域0                        域1        域2        域3
Boys in Company C       :HK     :192    :2192
Alien                   :HK     :119    :1982
The Hill                :KL     :63     :2972
Aliens                  :HK     :532    :4892
Star Wars               :HK     :301    :4102
A Few Good Men          :KL     :445    :5851
Toy Story               :HK     :239    :3972

=========================================

文件是否已分類
怎樣分辨文件是否已分類?如果只有30行,看看就知道了,但如果是400行呢,使用sort -c查看sort文件是否按某種順序分類。
[root@Linuxsvr lab]# sort -c video
sort: video:2: disorder: Alien                  :HK     :119    :1982
結果顯示未分類,現在將video分類,並存爲2.video
[root@Linuxsvr lab]# sort -t: video >2.video
[root@Linuxsvr lab]# sort -c 2.video
[root@Linuxsvr lab]#
沒有任何錯誤提示,返回提示符表明已分類。然而如果測試成功,返回一個信息行會更好。

5.
基本sort

最基本的sort方式爲sort filename,按第一域進行分類(分類鍵0)。實際上讀文件時sort操作將行中各域進行比較,
這裏返回基於第一域sort的結果
[root@Linuxsvr lab]# sort -t: video

A Few Good Men          :KL     :445    :5851
Alien                   :HK     :119    :1982
Aliens                  :HK     :532    :4892
Boys in Company C       :HK     :192    :2192
Star Wars               :HK     :301    :4102
The Hill                :KL     :63     :2972
Toy Story               :HK     :239    :3972

sort分類求逆
如果要逆向sort結果,使用- r選項。在通讀大的註冊文件時,使用逆向sort很方便。下面是按域0分類的逆向結果。
[root@Linuxsvr lab]# sort -t: -r video
Toy Story               :HK     :239    :3972
The Hill                :KL     :63     :2972
Star Wars               :HK     :301    :4102
Boys in Company C       :HK     :192    :2192
Aliens                  :HK     :532    :4892
Alien                   :HK     :119    :1982
A Few Good Men          :KL     :445    :5851

按指定域分類
有時需要只按第2域(分類鍵1)分類。這裏爲重排 報文中“供應區代碼”,使用t 1,意義爲按分類鍵1分類。
下面的例子中,所有供應區代碼按分類鍵1分類;
注意分類鍵2和3對應各域也被分類。因爲第2域有重複,sort會再重複的情況下優先考慮下一個域的順序。而且是按照第一個字符分類,並不是

按照整個數值大小分類63小於445,卻被排到後面,因爲第一個字符是6,大於4。

[root@Linuxsvr lab]# sort -t: +1 video

Alien                   :HK     :119    :1982
Boys in Company C       :HK     :192    :2192
Toy Story               :HK     :239    :3972
Star Wars               :HK     :301    :4102
Aliens                  :HK     :532    :4892
A Few Good Men          :KL     :445    :5851
The Hill                :KL     :63     :2972

數值域分類
依此類推,要按第三域(第二分類鍵)分類,使用t 2。但是因爲這是數值域,即爲數值分類,可以使用- n選項。下面例子爲按季度租金分類命

令及結果:
[root@Linuxsvr lab]# sort -t: +2n video

The Hill                :KL     :63     :2972
Alien                   :HK     :119    :1982
Boys in Company C       :HK     :192    :2192
Toy Story               :HK     :239    :3972
Star Wars               :HK     :301    :4102
A Few Good Men          :KL     :445    :5851
Aliens                  :HK     :532    :4892
使用-n選項是按照數值大小進行排列的,不使用-n選項是按照數字位排列,先看最左邊第一位大小,如果第一位相同再看第二位大小

如果不指定n,如下
[root@Linuxsvr lab]# sort -t: +2 video

Alien                   :HK     :119    :1982
Boys in Company C       :HK     :192    :2192
Toy Story               :HK     :239    :3972
Star Wars               :HK     :301    :4102
A Few Good Men          :KL     :445    :5851
Aliens                  :HK     :532    :4892
The Hill                :KL     :63     :2972

數值域倒序:

[root@Linuxsvr lab]# sort -t: +2nr video
Aliens                  :HK     :532    :4892
A Few Good Men          :KL     :445    :5851
Star Wars               :HK     :301    :4102
Toy Story               :HK     :239    :3972
Boys in Company C       :HK     :192    :2192
Alien                   :HK     :119    :1982
The Hill                :KL     :63     :2972

唯一性分類
有時,原文件中有重複行,這時可以使用- u選項進行唯一性(不重複)分類以去除重複行,下例中A l i e n有相同的兩行。帶重複行的文件

如下,其中A l i e n插入了兩次:
[root@Linuxsvr lab]# cat video
Boys in Company C       :HK     :192    :2192
Alien                   :HK     :119    :1982
The Hill                :KL     :63     :2972
Aliens                  :HK     :532    :4892
Star Wars               :HK     :301    :4102
A Few Good Men          :KL     :445    :5851
Toy Story               :HK     :239    :3972
Aliens                  :HK     :532    :4892

使用- u選項去除重複行,不必加其他選項, sort會自動處理。
[root@Linuxsvr lab]# sort -u video
A Few Good Men          :KL     :445    :5851
Alien                   :HK     :119    :1982
Aliens                  :HK     :532    :4892
Boys in Company C       :HK     :192    :2192
Star Wars               :HK     :301    :4102
The Hill                :KL     :63     :2972
Toy Story               :HK     :239    :3972
[root@Linuxsvr lab]# sort video
A Few Good Men          :KL     :445    :5851
Alien                   :HK     :119    :1982
Aliens                  :HK     :532    :4892
Aliens                  :HK     :532    :4892
Boys in Company C       :HK     :192    :2192
Star Wars               :HK     :301    :4102
The Hill                :KL     :63     :2972
Toy Story               :HK     :239    :3972

使用k的其他sort方法
sort還有另外一些方法指定分類鍵。可以指定k選項,第1域(分類鍵)以1開始。不要與前面相混淆。其他選項也可以使用k,主要用於指定分

類域開始的字符數目。格式:
-k  keydef
The keydef argument is a restricted sort key field  definition. The format of this definition is:

[root@Linuxsvr lab]# sort -t: -k[field_start[type][,field_end[type]]] video              

[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien                   :HK     :119    :1982
Aliens                  :HK     :532    :4892
Aliens                  :HK     :532    :4892
Boys in Company C       :HK     :192    :2192
Star Wars               :HK     :301    :4102
Toy Story               :HK     :239    :3972
A Few Good Men          :KL     :445    :5851
The Hill                :KL     :63     :2972

如果不指定結束域,分類將會按照後面的域以次排序。如果上面的例子不指定-k2,2後面結束域,結果如下:
[root@Linuxsvr lab]# sort -t: -k2 -k1,1 video
Alien                   :HK     :119    :1982
Boys in Company C       :HK     :192    :2192
Toy Story               :HK     :239    :3972
Star Wars               :HK     :301    :4102
Aliens                  :HK     :532    :4892
Aliens                  :HK     :532    :4892
A Few Good Men          :KL     :445    :5851
The Hill                :KL     :63     :2972
上面的例子不會再以第一域排序,而是按照第二域排序,如果第二域有重複,優先考慮第三域,如果再有重複,考慮第四域,而不是第一域。


用k做分類鍵排序
可以指定分類鍵次序。再全部將結果反向排序,方法如下:
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 -r video
The Hill                :KL     :63     :2972
A Few Good Men          :KL     :445    :5851
Toy Story               :HK     :239    :3972
Star Wars               :HK     :301    :4102
Boys in Company C       :HK     :192    :2192
Aliens                  :HK     :532    :4892
Aliens                  :HK     :532    :4892
Alien                   :HK     :119    :1982
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien                   :HK     :119    :1982
Aliens                  :HK     :532    :4892
Aliens                  :HK     :532    :4892
Boys in Company C       :HK     :192    :2192
Star Wars               :HK     :301    :4102
Toy Story               :HK     :239    :3972
A Few Good Men          :KL     :445    :5851
The Hill                :KL     :63     :2972

下面的例子把Aliens改爲Bliens,先對第三域反向排序,重複的地方再按照第一域正向排。
[root@Linuxsvr lab]# sort -t: +2nr -k1,1 video
Aliens                  :HK     :532    :4892
Bliens                  :HK     :532    :4892
A Few Good Men          :KL     :445    :5851
Star Wars               :HK     :301    :4102
Toy Story               :HK     :239    :3972
Boys in Company C       :HK     :192    :2192
Alien                   :HK     :119    :1982
The Hill                :KL     :63     :2972
下面例子是先對第三域 正向排,重複的地方再按照第一域反向排
[root@Linuxsvr lab]# sort -t: +2n -k1,1 -r video
The Hill                :KL     :63     :2972
Alien                   :HK     :119    :1982
Boys in Company C       :HK     :192    :2192
Toy Story               :HK     :239    :3972
Star Wars               :HK     :301    :4102
A Few Good Men          :KL     :445    :5851
Bliens                  :HK     :532    :4892
Aliens                  :HK     :532    :4892
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章