Я хочу отсортировать файлы по номеру в имени файла. Вот файлы:
$ ls *.f
0.f 13.f 1.f 22.f 4.f abc.f
Результат сортировки:
$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f
То, что я ожидал, было:
$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f
Почему abc.f
показали сразу после 0.f
и до 1.f
? Это потому что 0
не рассматривается как число sort
? Я искал в Интернете и не нашел никаких ссылок.
LC_ALL=C
.Ответы:
Причина в том, что при использовании числовой сортировки строки без чисел рассматриваются как ноль. Сортировка GNU правильно определяет поведение, но не комментирует почему. Справочная страница по иллюминаторам для сортировки SunOS дает объяснение:
Это поведение также указано в SUSv4 и POSIX.1-2008 ( http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html ), используя то же словоблудие, что и на man-странице illumos.
У сортировки GNU также есть
-g
«общая числовая сортировка», которая сортирует по числам с плавающей запятой вместо целых, где строки пустых цифр сортируются до нуля. Я не уверен, является ли это побочным эффектом или намеренным. Тем не менее,-g
приходит с предупреждением, так как это значительно медленнее, чем-n
. Если вы сортируете большой набор данных или делаете что-то, чего ждут пользователи, вам следует избегать-g
.источник
sort
с двумя строками, имеющими одинаковый ключ.Вы можете использовать -g
источник