Как отсортировать сложные строки в оболочке? - PullRequest
0 голосов
/ 28 августа 2018

Мне нужно отсортировать имена ячеек следующим образом (не имеет значения, исходит ли оно из файла или переменной): ожидаемый результат

BAR.A1
BAR.A1-1
BAR.A2
BAR.A3
BAR.A10
FOO.A1
FOO.B1
FOO.B1-1

Что я пробовал результаты в неправильном порядке:

BAR.A1
BAR.B1
BAR.B1-1
FOO.A1
FOO.A10 <--- wrong place
FOO.A1-1
FOO.A2
FOO.A3

Я пробовал много комбинаций

sort -n
sort -h
sort -d

никто не работает.

Любая подсказка?

Ответы [ 4 ]

0 голосов
/ 28 августа 2018
perl -MSort::Key::Natural=natsort -e'print for natsort <>'

См. Указание файла для обработки на однострочном языке Perl для использования.

0 голосов
/ 28 августа 2018

Есть еще несколько неясных моментов (вы не говорите, какой именно вывод вы хотите), но sort -g должен это сделать:

$ cat s.txt
FOO.A1
FOO.A1-1
FOO.A2
FOO.A3
FOO.A10
BAR.A1
BAR.B1
BAR.B1-1
$ sort -g s.txt
BAR.A1
BAR.B1
BAR.B1-1
FOO.A1
FOO.A1-1
FOO.A10
FOO.A2
FOO.A3

-g определяется так:

-g, --general-numeric-sort, --sort = general-numeric Сортировать по общему числовому значению. В отличие от -n, эта опция обрабатывает общие плавающие точки. Он имеет более разрешающий формат, чем тот, который разрешен -n, но имеет существенный недостаток производительности.

Но -n тоже подходит, поэтому желаемый результат не ясен.

Исходя из ваших дальнейших обновлений, возможно, это то, что вы хотите:

$ sort -t '.' -k 2 -V < s.txt
BAR.A1
FOO.A1
FOO.A1-1
FOO.A2
FOO.A3
FOO.A10
BAR.B1
BAR.B1-1
0 голосов
/ 28 августа 2018

Похоже, вы хотите отсортировать по полю 1 в алфавитном порядке, а затем поле 2 по версии

sort -t. -k 1,1 -k2,2V <<END
FOO.A1
FOO.A1-1
FOO.A2
FOO.A3
FOO.A10
BAR.A1
BAR.B1
BAR.B1-1
END
BAR.A1
BAR.B1
BAR.B1-1
FOO.A1
FOO.A1-1
FOO.A2
FOO.A3
FOO.A10
0 голосов
/ 28 августа 2018

версия сортировки

$ sort -V file

BAR.A1
BAR.B1
BAR.B1-1
FOO.A1
FOO.A2
FOO.A3
FOO.A10
FOO.A1-1

обновлено на основе уточненного вопроса

$ sort -t- -k1,1V -k2 file

BAR.A1
BAR.B1
BAR.B1-1
FOO.A1
FOO.A1-1
FOO.A2
FOO.A3
FOO.A10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...