歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下sort命令的使用

Linux下sort命令的使用

日期:2017/2/28 14:23:33   编辑:Linux教程

Linux下的sort命令默認將文件中的每一行為單位,進行排序,然後輸出。具體地,就是從每行的第一個字符開始,依次按ASCII碼值進行比較,最後將結果按升序排序輸出。

1、sort常用選項

  • -u 在排序的時候忽略相同的行,類似於uniq命令,不過uniq命令只能跳過相鄰的相同行,並不能進行排序。
  • -n 按照數字大小排序,而不是文本的ascii碼順序。
  • -r 反序,也就是降序。
  • -t 指定列分隔符,注意這裡的分隔符只能是一個字符,不能是多個字符,-t, --field-separator=SEP use SEP instead of non-blank to blank transition,默認以非空到空的分隔作為列分隔符。
  • -k 指定排序關鍵字的列。
  • -s 有時候,sort會在根據指定字段排完序之後,自動根據其他字段進行resort,為了保證原來的數據記錄的順序,可以使用-s選項來禁止sort命令的resort機制。

這裡的-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

到這裡,指定字段的方法應該就說完了,以後用到更加復雜的仍會貼在這裡。^_^

Copyright © Linux教程網 All Rights Reserved