it-swarm.com.ru

Как отсортировать строки, которые содержат общий префикс и суффикс численно из Bash?

Вот список файлов:

some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt

Теперь я хотел бы отсортировать его по численности. Начиная с * 23 * и заканчивая * 102 *.

Я пробовал -n и -g. -t не помогает в этих грязных строках. 

Могу ли я игнорировать ведущие строки к числу с опцией, или я должен быть умным и сценарий?

27
AWE

Используйте ls -lv

Со страницы руководства:

-v     natural sort of (version) numbers within text
37
Steve

Попробуйте следующее:

sort -t '_' -k 2n
  • -t '_' (устанавливает разделитель на символ подчеркивания)
  • -k 2n (сортирует по второму столбцу, используя числовой порядок)

DEMO.

30
João Silva

В общем случае попробуйте преобразование Шварца .

Вкратце, разбейте число на его собственное поле, сортируйте по нему и отбросьте добавленное поле.

# In many shells, use ctrl-v tab to insert a literal tab after the first \2
sed 's/^\([^0-9]*\)\([0-9][0-9]*\)/\2   \1\2/' file |
sort -n |
cut -f2-

Это хорошо работает, если у ввода нет явного разделителя, как для следующего ввода.

abc1
abc10
abc2

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

2
tripleee

Если доступно, просто используйте sort -V. Это сортировка по номерам версий, но она работает как опция «естественной сортировки».

$ ff=$( echo some.string_{100,101,102,23,24,25}_with_numbers.in-it.txt )

Без сортировки:

$ for f in $ff ; do echo $f ; done
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt

С сортировкой -V:

$ for f in $ff ; do echo $f ; done | sort -V
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
0
Rhubbarb