2008-12-10 97 views
113

我有可能需要按1-n鍵排序的大文件。其中一些鍵可能是數字,其中一些鍵可能不是。這是一個固定寬度的列式文件,因此沒有分隔符。使用Unix排序排序多個鍵

有沒有一種很好的方法來做到這一點與Unix排序?使用一個鍵就像使用'-n'一樣簡單。我已閱讀手冊頁並簡要搜索了Google,但沒有找到一個好例子。我將如何去完成這件事?

注意:由於文件大小的潛力,我排除了Perl。這將是最後的手段。

+0

一個或兩個示例的數據線將是很有益用於創建例如命令行。此外,「1-n」鍵是否意味着您需要通過可變數量的鍵進行排序?這樣做沒有腳本會很有趣... – 2008-12-10 20:58:55

+0

我有一個PHP包裝器繞sort命令啓用1-n功能。 – 2008-12-10 21:28:29

回答

56

使用-k選項(或--key=POS1[,POS2])。它可以出現多次,每個鍵可以有全局選項(如n用於數字排序)

+6

從排序手冊頁:「POS是F [.C] [OPTS],其中F是字段編號,C是字段中的字符位置;都是原點1.」請參閱手冊頁獲取完整文檔。 – 2008-12-10 20:59:50

+37

另請參閱andras的答案,如果你不想瘋了。 – ron 2011-08-30 08:54:25

+1

上面的兩條評論都是準確的和附加的。謝謝,先生們。 – 2012-12-11 04:26:34

85

-k選項是你想要的。

-k 1.4,1.5n -k 1.14,1.15n 

會用字符在第一個字段(它是固定的寬度所有一場)和排序數值作爲第一關鍵位置4-5。

第二個鍵也是第一個字段中的字符14-15。

(編輯)

例(所有我是DOS/Cygwin的方便):

dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r 

的數據:

12/10/2008 01:10 PM   1,564,990 outfile.txt 

排序按月數目錄列表(POS 4-5),然後按文件名(位置40-60)反向。由於沒有標籤,因此所有字段都需要排序。

+0

如果輸入數據中沒有空格,則只有一個字段。儘管如此,你的例子很有用。 – 2008-12-11 06:05:02

10

我相信,在你的情況類似

sort [email protected] -k1.1,1.4 -k1.5,1.7 ... <inputfile 

會更好地工作。 @是字段分隔符,確保它是一個無處可見的字符。那麼你的輸入被認爲是由一列組成的。

編輯:顯然clintp已經給出了類似的答案,對不起。正如他指出的那樣,可以將標誌'n'和'r'添加到每個-k ....選項。

262

請務必小心,雖然:

如果你想主要由3場對文件進行排序,其次是由2場你不想這樣:

sort -k 3 -k 2 < inputfile 

你想這個代替:

sort -k 3,3 -k 2,2 < inputfile 

第一個按字符串從字段3開始到行結束(可能是唯一的)對文件進行排序。

-k, --key=POS1[,POS2]  start a key at POS1 (origin 1), end it at POS2 
          (default end of line) 
5

注意,也可能期望穩定的排序與-s開關,從而使同樣排名線路中的輸出保持原有相對順序太。

2

我只是想添加一些提示,當你使用排序時,要小心你的語言環境,影響鍵比較的順序。我通常明確使用LC_ALL = C來創建我想要的語言環境。

16

這裏是一個由數字和字典以便在csv文件各種列進行排序,第5列和作爲字典順序

~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d sort.csv 
1,10,b,22,Ga 
2,2,b,20,F 
2,2,b,22,Ga 
2,2,c,19,Ga 
2,2,c,19,Gb,hi 
2,2,c,19,Gb,hj 
2,3,a,9,C 

~/test>cat sort.csv 
2,3,a,9,C 
2,2,b,20,F 
2,2,c,19,Gb,hj 
2,2,c,19,Gb,hi 
2,2,c,19,Ga 
2,2,b,22,Ga 
1,10,b,22,Ga 

注後的-k1,1n在柱1和在結束數字裝置起動塔1 如果我下面完成,它將有級聯柱1和2製備1,10-分類爲110

~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d sort.csv 
2,2,b,20,F 
2,2,b,22,Ga 
2,2,c,19,Ga 
2,2,c,19,Gb,hi 
2,2,c,19,Gb,hj 
2,3,a,9,C 
1,10,b,22,Ga