У меня есть список, такой как:
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)
, который поможет мне.(обратите внимание, что положение числовых полей неизвестно).Есть ли лучший способ сделать то же самое?