我有可能需要按1-n鍵排序的大文件。其中一些鍵可能是數字,其中一些鍵可能不是。這是一個固定寬度的列式文件,因此沒有分隔符。使用Unix排序排序多個鍵
有沒有一種很好的方法來做到這一點與Unix排序?使用一個鍵就像使用'-n'一樣簡單。我已閱讀手冊頁並簡要搜索了Google,但沒有找到一個好例子。我將如何去完成這件事?
注意:由於文件大小的潛力,我排除了Perl。這將是最後的手段。
我有可能需要按1-n鍵排序的大文件。其中一些鍵可能是數字,其中一些鍵可能不是。這是一個固定寬度的列式文件,因此沒有分隔符。使用Unix排序排序多個鍵
有沒有一種很好的方法來做到這一點與Unix排序?使用一個鍵就像使用'-n'一樣簡單。我已閱讀手冊頁並簡要搜索了Google,但沒有找到一個好例子。我將如何去完成這件事?
注意:由於文件大小的潛力,我排除了Perl。這將是最後的手段。
使用-k
選項(或--key=POS1[,POS2]
)。它可以出現多次,每個鍵可以有全局選項(如n
用於數字排序)
從排序手冊頁:「POS是F [.C] [OPTS],其中F是字段編號,C是字段中的字符位置;都是原點1.」請參閱手冊頁獲取完整文檔。 – 2008-12-10 20:59:50
另請參閱andras的答案,如果你不想瘋了。 – ron 2011-08-30 08:54:25
上面的兩條評論都是準確的和附加的。謝謝,先生們。 – 2012-12-11 04:26:34
-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)反向。由於沒有標籤,因此所有字段都需要排序。
如果輸入數據中沒有空格,則只有一個字段。儘管如此,你的例子很有用。 – 2008-12-11 06:05:02
我相信,在你的情況類似
sort [email protected] -k1.1,1.4 -k1.5,1.7 ... <inputfile
會更好地工作。 @是字段分隔符,確保它是一個無處可見的字符。那麼你的輸入被認爲是由一列組成的。
編輯:顯然clintp已經給出了類似的答案,對不起。正如他指出的那樣,可以將標誌'n'和'r'添加到每個-k ....選項。
請務必小心,雖然:
如果你想主要由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)
注意,也可能期望穩定的排序與-s
開關,從而使同樣排名線路中的輸出保持原有相對順序太。
我只是想添加一些提示,當你使用排序時,要小心你的語言環境,影響鍵比較的順序。我通常明確使用LC_ALL = C來創建我想要的語言環境。
這裏是一個由數字和字典以便在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
一個或兩個示例的數據線將是很有益用於創建例如命令行。此外,「1-n」鍵是否意味着您需要通過可變數量的鍵進行排序?這樣做沒有腳本會很有趣... – 2008-12-10 20:58:55
我有一個PHP包裝器繞sort命令啓用1-n功能。 – 2008-12-10 21:28:29