Ответ 1
Вам нужно указать, где начинается ваш ключ сортировки:
sort -n -k1.4 list.txt
В противном случае он начинается с начала, не может преобразовать строку в число и возвращается к алфавитному сравнению.
У меня есть список имен таблиц, которые не соответствуют порядку. Как я могу получить их в правильном логическом порядке?
$ 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, для этого мне не обязательно нужна отдельная утилита.
Вам нужно указать, где начинается ваш ключ сортировки:
sort -n -k1.4 list.txt
В противном случае он начинается с начала, не может преобразовать строку в число и возвращается к алфавитному сравнению.
Вы всегда можете выполнить сортировку с аргументом -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
Поскольку это помечено как вопрос Vim, я полагал, что стоит упомянуть опцию Vim (хотя я лично использовал бы sort
, поскольку данные уже находятся в файле). Это просто
:sort n
Так как числовая сортировка Vim игнорирует до первого десятичного числа, не нужно игнорировать "TAB" (:sort
может взять шаблон для игнорирования, например, :sort n /TAB/
). Как обычно, :h :sort
для получения дополнительной информации.
Вы можете сделать это в Perl или на любом языке, где sort позволяет указать оператор сравнения:
sub numcomp() {
$a =~ /([0-9]*)$/; $aa = $1;
$b =~ /([0-9]*)$/; $bb = $1;
$aa <=> $bb;
}
sort numcomp @mylist...
код > (Не беспокойтесь, расскажите мне, что это ребенок Перл. Я... гм, я написал это так специально, чтобы было легко понять.) (Не беспокойтесь, чтобы сказать мне это неправильно. Я... гм, я написал это специально для упражнений для читателя.)