2013-09-25 72 views
1

我有一個未排序的服務器列表,如下所示:按字母順序對連字符名稱進行排序,然後按數字排序

bgsqlnp-z101 
bgsqlnp-z102 
bgsqlnp-z103 
bgsqlnp-z2 
bgsqlnp-z3 
bgsqlnp-z5 
dfsqlnp-z108 
dfsqlnp-z4 
bgsqlnp-z1 
dfsqlprd-z8 
fuqddev-z88 
fuqhdev-z8 
ghsbqudev-z18 
heiappprod-z1 
htsybprd-z24 

使用sort來讀入文件,我試圖得到以下;

bgsqlnp-z1 
bgsqlnp-z2 
bgsqlnp-z3 
bgsqlnp-z5 
bgsqlnp-z101 
bgsqlnp-z102 
bgsqlnp-z103 
dfsqlnp-z4 
dfsqlnp-z108 
dfsqlprd-z8 
fuqddev-z88 
fuqhdev-z8 
ghsbqudev-z18 
heiappprod-z1 
htsybprd-z24 

我只是無法爲我的-k選項找到正確的keydef。 這是我所能得到的最接近的;

sort -k2n -t"z" 

bgsqlnp-z1 
bgsqlnp-z101 
bgsqlnp-z102 
bgsqlnp-z103 
bgsqlnp-z2 
bgsqlnp-z3 
bgsqlnp-z5 
dfsqlnp-z108 
dfsqlnp-z4 
dfsqlprd-z8 
fuqddev-z88 
fuqhdev-z8 
ghsbqudev-z18 
heiappprod-z1 
htsybprd-z24 

數字的順序是正確的,但服務器名稱沒有排序。 嘗試使用多字段keydef(-k1,2n)似乎沒有任何效果(我根本沒有排序)。

下面是關於服務器名稱的一些額外信息; 1)所有這些名稱都有一個「-z [1-200]」後綴,重複一些數字。 2)服務器名稱是不同的長度(4到16個字符) 因此使用'切'是不可能的

+1

發現瞭如何在Linux做到這一點! (RHEL5) 'sed's/-z//'two | sort -k1,1 -k2g | sed's// -z /'' 希望有一種方法可以用UNIX(Solaris)...... – Signal15

+0

'sed'的東西包裝將起作用。當然,solaris使用的是基於零的密鑰,(/ usr/xpg4/bin/sort可能是grok -k選項),比如'-0 +1 +1 -2',但我不認識排序鍵的'g'選項。 '人排序'是你的朋友。祝你好運。 – shellter

+0

'sort'的'-g'選項是Linux特有的,意思是「字典排序」。數字以「正確」順序(1,2,3,4,30,100)顯示,而不是100,1,2,3,30,4。 – Signal15

回答

1

您可以使用sed來避開有多字符分隔符。您可以在每個排序鍵定義之後在數字和字典順序之間切換。請注意,您必須爲多個鍵具有多個-k選項,請查看手冊頁以獲取有關此信息的詳細信息。

事情是這樣的:

sed 's/-z/ /' file | sort -k2,2n -k1,1d | sed 's/ /-z/' 
+0

在UNIX(Solaris 10)上,只按第二列(數字)排序所有內容。 :/ – Signal15

+0

@ Signal15您正在嘗試按第二列排序,並使用第一列打破關係,對吧? – idfah

+0

@ Signal15我沒有Solaris機器來測試了,但根據手冊頁,它看起來應該起作用 – idfah

相關問題