Подтвердить что ты не робот

Как сортировать буквенно-цифровые строки в Unix?

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

$ 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, для этого мне не обязательно нужна отдельная утилита.

4b9b3361

Ответ 1

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

sort -n -k1.4 list.txt

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

Ответ 2

Вы всегда можете выполнить сортировку с аргументом -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  

Ответ 3

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

:sort n

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

Ответ 4

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

sub numcomp() {

 $a =~ /([0-9]*)$/; $aa = $1;
 $b =~ /([0-9]*)$/; $bb = $1;
 $aa <=> $bb;

}

sort numcomp @mylist...

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