Смешанная лексикографическая и числовая сортировка - PullRequest
2 голосов
/ 16 декабря 2010

У меня есть список, такой как:

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 Ответ

1 голос
/ 17 декабря 2010

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"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...