按字母顺序排序带连字符的名称,然后按数字排序

时间:2013-09-25 16:46:37

标签: linux unix sorting solaris

我有一个未分类的服务器列表,如下所示;

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个字符)    所以使用'cut'是不可能的

1 个答案:

答案 0 :(得分:1)

您可以使用sed来绕过多字符分隔符。您可以在每个排序键定义后在数字和字典顺序之间切换。请注意,您必须为多个键提供多个-k选项,请查看手册页以获取有关此内容的详细信息。

这样的事情:

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