2013-09-25 71 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

相关问题