Linux下的sort命令默認將文件中的每一行為單位,進行排序,然後輸出。具體地,就是從每行的第一個字符開始,依次按ASCII碼值進行比較,最後將結果按升序排序輸出。
1、sort常用選項
這裡的-k選項比較復雜,這裡單獨說一下-k後面指定參數的格式:
FStart.CStartModifier,FEnd.CEndModifier
開始部分 , 結束部分
-k選項用來指定排序的關鍵字列,也就是排序依據的字段。-k後的參數格式大致分為兩個部分,開始部分和結束部分。開始部分中又可以看出三個參數:FStart、CStart和Modifier,其中FStart表示第第幾列(FStart表示Field Start,也就是這個值用來指定排序依據所開始的列,列的序號從1開始,不是程序猿通常習慣的0),CStart表示第幾個字符(Character Start,就是說這個值用來說明排序依據從該列的第幾個字符開始,如果沒有指定,默認從第一個字符開始),Modifier就是n、r等指定數值排序、逆序等的選項。與開始部分類似,結束部分也有三個參數:FEnd、CEnd和Modifier,其中FEnd就是指定排序依據到第幾列結束,CEnd指定排序依據到該列的第幾個字符結束,如果省略或者指定為0,則默認到該域的最後一個字符,Modifier的含義和開始部分一樣。
注意,如果沒有開始部分,則默認從行首開始,如果省略結束部分,則默認到行末結束。
2、例子
這裡的例子用下面的文件作為例子:
$ cat name_list.txt
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Abbie Cornishi:female:actor:19820807:1.73m:Klondike
Hara Mikie:female:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
Drew Barrymore:female:actor:19750222:1.63m:Music and Lyrics
Kobe Bryant:male:NBA player:19780823:1.98m:Los Angeles Lakers
Timothy Theodore Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
Tony Parker:male:NBA player:19820517:1.88m:San Antonio Spurs
Manu Ginóbili:male:NBA player:19770728:1.98m:San Antonio Spurs
LaMarcus Nurae Aldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
$
2.1 常見的r,u,n選項的使用
$ sort name_list.txt
Abbie Cornishi:female:actor:19820807:1.73m:Klondike
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Drew Barrymore:female:actor:19750222:1.63m:Music and Lyrics
Hara Mikie:female:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
Kobe Bryant:male:NBA player:19780823:1.98m:Los Angeles Lakers
LaMarcus Nurae Aldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
Manu Ginóbili:male:NBA player:19770728:1.98m:San Antonio Spurs
Timothy Theodore Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
Tony Parker:male:NBA player:19820517:1.88m:San Antonio Spurs
$ sort -u name_list.txt
Abbie Cornishi:female:actor:19820807:1.73m:Klondike
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Drew Barrymore:female:actor:19750222:1.63m:Music and Lyrics
Hara Mikie:female:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
Kobe Bryant:male:NBA player:19780823:1.98m:Los Angeles Lakers
LaMarcus Nurae Aldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
Manu Ginóbili:male:NBA player:19770728:1.98m:San Antonio Spurs
Timothy Theodore Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
Tony Parker:male:NBA player:19820517:1.88m:San Antonio Spurs
$ sort -r name_list.txt
Tony Parker:male:NBA player:19820517:1.88m:San Antonio Spurs
Timothy Theodore Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
Manu Ginóbili:male:NBA player:19770728:1.98m:San Antonio Spurs
LaMarcus Nurae Aldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
Kobe Bryant:male:NBA player:19780823:1.98m:Los Angeles Lakers
Hara Mikie:female:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
Drew Barrymore:female:actor:19750222:1.63m:Music and Lyrics
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Abbie Cornishi:female:actor:19820807:1.73m:Klondike
$ sort -ru name_list.txt
Tony Parker:male:NBA player:19820517:1.88m:San Antonio Spurs
Timothy Theodore Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
Manu Ginóbili:male:NBA player:19770728:1.98m:San Antonio Spurs
LaMarcus Nurae Aldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
Kobe Bryant:male:NBA player:19780823:1.98m:Los Angeles Lakers
Hara Mikie:female:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
Drew Barrymore:female:actor:19750222:1.63m:Music and Lyrics
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Abbie Cornishi:female:actor:19820807:1.73m:Klondike
2.2 -k字段的使用
(1)根據人名列表中出生年份字段排序
出生年份就是出生年月的前四個字符。
$ sort -t : -k 4,4.4n name_list.txt
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Drew Barrymore:female:actor:19750222:1.63m:Music and Lyrics
Timothy Theodore Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
Manu Ginóbili:male:NBA player:19770728:1.98m:San Antonio Spurs
Kobe Bryant:male:NBA player:19780823:1.98m:Los Angeles Lakers
Abbie Cornishi:female:actor:19820807:1.73m:Klondike
Tony Parker:male:NBA player:19820517:1.88m:San Antonio Spurs
LaMarcus Nurae Aldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
Hara Mikie:female:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
(2)根據人名列表中出生月份字段排序
出生月份就是人名列表中出生年月字段的第5到第6字符。
$ sort -t : -k 4.5,4.6n name_list.txt
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Drew Barrymore:female:actor:19750222:1.63m:Music and Lyrics
Timothy Theodore Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
Tony Parker:male:NBA player:19820517:1.88m:San Antonio Spurs
Hara Mikie:female:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
LaMarcus Nurae Aldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
Manu Ginóbili:male:NBA player:19770728:1.98m:San Antonio Spurs
Abbie Cornishi:female:actor:19820807:1.73m:Klondike
Kobe Bryant:male:NBA player:19780823:1.98m:Los Angeles Lakers
(3)根據身高排序
$ sort -t : -k 5,5.4n name_list.txt
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Hara Mikie:female:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
Drew Barrymore:female:actor:19750222:1.63m:Music and Lyrics
Abbie Cornishi:female:actor:19820807:1.73m:Klondike
Tony Parker:male:NBA player:19820517:1.88m:San Antonio Spurs
Kobe Bryant:male:NBA player:19780823:1.98m:Los Angeles Lakers
Manu Ginóbili:male:NBA player:19770728:1.98m:San Antonio Spurs
LaMarcus Nurae Aldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
Timothy Theodore Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
到這裡,指定字段的方法應該就說完了,以後用到更加復雜的仍會貼在這裡。^_^