2013-06-12 4 views
39

Я часто хотел сортировать строки с номерами в них, чтобы при сортировке, например. Результат abc_1, abc_2, abc_10. Каждый механизм сортировки, который я видел, имеет вид abc_1, abc_10, abc_2, то есть символ по символу слева.bash: сортировка строк с номерами

Есть ли эффективный способ сортировки, чтобы получить результат, который я хочу? Идея взглянуть на каждого персонажа, определяя, является ли это цифрой, построение подстроки из последующих цифр и сортировка по ней в виде числа слишком ужасна, чтобы рассмотреть в bash.

Нет бородатого * nix guru реализована альтернативная версия sort с опцией --sensible_numerical?

+0

Ваш префикс всегда то же самое? –

ответ

75

Выполнить эту

sort -t _ -k 2 -g data.file 
  • -t разделитель
  • -k ключ/колонки
  • -g общий числовой сортировки
+1

Ему нужно отсортировать по числу - это второе поле: 'printf 'abc_2 \ nabc_1 \ nabc_10 \ n" | sort -t _ -k 2 -g' –

+0

@RomanNewaza, Спасибо! Вы знаете, ноль также является числом. :-) –

+1

Это не основанный на нуле. Посмотрите на страницу руководства. –

21

Я думаю, что это расширение GNU для sort, но вы ищете --version-sort (или -V):

$ printf "prefix%d\n" $(seq 10 -3 1) 
prefix10 
prefix7 
prefix4 
prefix1 

$ printf "prefix%d\n" $(seq 10 -3 1) | sort 
prefix1 
prefix10 
prefix4 
prefix7 

$ printf "prefix%d\n" $(seq 10 -3 1) | sort --version-sort 
prefix1 
prefix4 
prefix7 
prefix10 

https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

+0

увы, этот вариант еще не реализован в старой версии сортировки, доступной в гериатрической версии RHEL, над которой я развиваюсь. – hardcode57

+0

«Сорт -V» работал хорошо для меня. – nurettin

+0

«sort -V» также работал и для меня, какую версию RHEL вы используете? –

18

Попробуйте

$ cat a.txt 
abc_1 
abc_4 
abc_2 
abc_10 
abc_5 

$ sort -V a.txt 
abc_1 
abc_2 
abc_4 
abc_5 
abc_10