混合词典和数字排序

时间:2010-12-16 14:47:14

标签: sorting command-line text-processing unix

我有一个列表,例如:

input.txt中

foo.bar.1
foo.bar.2
foo.bar.3.x.y.z
foo.bar.10
foo.bar.0
baz.10.qux
baz.3.qux

需要排序。我需要将其视为一个点分开 字段,其中数字字段需要以数字方式排序。

所以我写道:

mixsort.py

#!/usr/bin/env python
import sys
seq = map(lambda l: map(lambda s: (s.isdigit() and [int(s)] or [s])[0], l),
          [ s.rstrip().split('.') for s in sys.stdin.readlines() ])
seq.sort()
sys.stdout.write( '\n'.join(['.'.join([str(i) for i in l]) for l in seq]) )

使用

$ mixsort.py < input.txt
baz.3.qux
baz.10.qux
foo.bar.0
foo.bar.1
foo.bar.2
foo.bar.3.x.y.z
foo.bar.10

但我在这里重新发明轮子了吗?有共同点吗? * nix实用程序,我需要做什么?有没有切换到sort(1) 会帮助我。 (注意数字字段的位置是 未知)。是否有更好的方法来做同样的事情?

1 个答案:

答案 0 :(得分:1)

coreutils版本8.7

使用版本排序:sort -V

输入:

frayser@gentoo ~ $ cat /tmp/list.ran
foo.bar.1
foo.bar.2
baz.10.qux
baz.3.qux
foo.bar.0
foo.bar.3.x.y.z
foo.bar.10

类别:

frayser@gentoo ~ $ LC_ALL=C sort -V /tmp/list.ran
baz.3.qux
baz.10.qux
foo.bar.0
foo.bar.1
foo.bar.2
foo.bar.3.x.y.z
foo.bar.10

我在联系人页面info coreutils "sort invocation"

中建议的info pages中找到了此信息