Как отсортировать буквенно-цифровые строки в Unix? - PullRequest
17 голосов
/ 25 ноября 2010

У меня есть список имен таблиц, которые вышли из строя.Как я могу получить их в правильном логическом порядке?

$ cat list.txt

TAB1
TAB13
TAB11
TAB19
TAB2
TAB3
TAB16
TAB17
TAB18
TAB9
TAB10
TAB8
TAB12
TAB20

$ cat list.txt | sort -n

TAB1
TAB10
TAB11
TAB12
TAB13
TAB16
TAB17
TAB18
TAB19
TAB2
TAB20
TAB3
TAB8
TAB9

Ожидаемый порядок:

TAB1
TAB2
TAB3
TAB8
TAB9
TAB10
TAB11
TAB12
TAB13
TAB16
TAB17
TAB18
TAB19
TAB20

Подойдут также любые ярлыки vim, мне не обязательно для этого нужна отдельная утилита.

Ответы [ 4 ]

26 голосов
/ 29 мая 2014

Вы всегда можете выполнить сортировку с аргументом -V для сортировки буквенно-цифровой строки ..

$ sort -V inputfile > outputfile

$ cat inputfile  
TAB1  
TAB13  
TAB11  
TAB19  
TAB2  
TAB3  
TAB16  
TAB17  
TAB18  
TAB9  
TAB10  
TAB8  
TAB12  
TAB20  

$ cat outputfile  
TAB1  
TAB2  
TAB3  
TAB8  
TAB9  
TAB10  
TAB11  
TAB12  
TAB13  
TAB16  
TAB17  
TAB18  
TAB19  
TAB20  
22 голосов
/ 25 ноября 2010

Вам необходимо указать, где начинается ваш ключ сортировки:

sort -n -k1.4 list.txt

В противном случае он начинается с начала, не может преобразовать строку в число и возвращается к алфавитному сравнению.

7 голосов
/ 26 ноября 2010

Поскольку это помечено как вопрос Vim, я подумал, что, возможно, стоит упомянуть опцию Vim (даже если бы я лично использовал sort, поскольку данные уже находятся в файле). Это просто

:sort n

Так как числовая сортировка Vim игнорирует до первого десятичного числа, не нужно игнорировать "TAB" (:sort может использовать шаблон для игнорирования, например, :sort n /TAB/ также будет работать). Как обычно, :h :sort для получения дополнительной информации.

2 голосов
/ 23 декабря 2010

Это можно сделать на Perl или на любом другом языке, где sort позволяет указать оператор сравнения:

sub numcomp() {</p> <pre><code> $a =~ /([0-9]*)$/; $aa = $1; $b =~ /([0-9]*)$/; $bb = $1; $aa <=> $bb;

}

sort numcomp @mylist ...

(Не говорите мне, что это ребенок, Perl. Я ... я написал это специально, чтобы было легко понять.) (Не говорите мне, что этонеправильно. Я ... я специально написал это как упражнение для читателя.)

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