1. 程式人生 > >[SHELL]:sort 命令詳解

[SHELL]:sort 命令詳解

post1 傳遞到m,n。m為域號,n為開始分類字元數;例如4,6意即以第5域分類,從第7個字元開始。

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

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

域分隔符為冒號,為此對此例需使用‘-t’選項。檔案如下:
[[email protected]
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+分隔符)選項,如:
[
[email protected]
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檔案是否按某種順序分類。
[
[email protected]
lab]# sort -c video
sort: video:2: disorder: Alien :HK :119 :1982
結果顯示未分類,現在將video分類,並存為2.video
[[email protected] lab]# sort -t: video >2.video
[[email protected] lab]# sort -c 2.video
[[email protected] lab]#
沒有任何錯誤提示,返回提示符表明已分類。然而如果測試成功,返回一個資訊行會更好。

5.
基本sort

最基本的sort方式為sort filename,按第一域進行分類(分類鍵0)。實際上讀檔案時sort操作將行中各域進行比較,
這裡返回基於第一域sort的結果
[[email protected] 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分類的逆向結果。
[[email protected] 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。

[[email protected] lab]# sort -t: +1 -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選項。下面例子為按季度租金分類命

令及結果:
[[email protected] lab]# sort -t: +2 -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,如下
[[email protected] lab]# sort -t: +2 -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

數值域倒序:

[[email protected] lab]# sort -t: +2 -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插入了兩次:
[[email protected] 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會自動處理。
[[email protected] 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
[[email protected] 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:

[[email protected] lab]# sort -t: -k[field_start[type][,field_end[type]]] video

[[email protected] 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後面結束域,結果如下:
[[email protected] 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做分類鍵排序
可以指定分類鍵次序。再全部將結果反向排序,方法如下:
[[email protected] 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
[[email protected] 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,先對第三域反向排序,重複的地方再按照第一域正向排。
[[email protected] lab]# sort -t: +2 -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
下面例子是先對第三域 正向排,重複的地方再按照第一域反向排
[[email protected] lab]# sort -t: +2 -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