Сортировка файла с целым числом в скобках без пробела

8

Я пытаюсь отсортировать файл следующим образом (это список имен подпрограмм)

cfn=(1370) __lib_file_MOD_file_open
fn=(1368) __universe_MOD_general_boot
fn=(916) __universe_MOD_general_main
fn=(6142) __grid_var_MOD_get_overlap
...

в соответствии с целым числом внутри скобок. Я сначала попробовал команду сортировки как

sort -t '=' -k 2 routine_list.txt

но тогда fn = (916) приходит в конце выхода.

fn=(1368) __universe_MOD_general_boot
cfn=(1370) __lib_file_MOD_file_open
fn=(6142) __grid_var_MOD_get_overlap
...
fn=(916) __universe_MOD_general_main

но я бы хотел, чтобы числа сортировались в возрастающем порядке (916 -> 1368 -> 1370 -> ...). Можно ли сделать это относительно просто, используя несколько команд или опций?

roygvib
источник
... какое-то отношение ?
mikeserv
@mikeserv мой любимый символ -> поющий подсолнух -> солнце -> спектр :)
roygvib

Ответы:

8

Как насчет:

sort -nt'(' -k2 file.txt

Тестовое задание :

$ sort -nt'(' -k2 file.txt 
fn=(916) __universe_MOD_general_main
fn=(1368) __universe_MOD_general_boot
cfn=(1370) __lib_file_MOD_file_open
fn=(6142) __grid_var_MOD_get_overlap
  • -n указывает на то, что мы сортируем

  • t'(' устанавливает разделитель как (

  • -k2устанавливает ключ в sortкачестве второго поля, т.е. начиная с цифр и заканчивая концом строки.

heemayl
источник
оооооо прикрепление -n работает ... Я прочитал страницу руководства и пробовал -n раньше, но в то время это не сработало ... но теперь приведенная выше комбинация работает отлично Большое спасибо :)
Ройгвиб
@roygvib, я бы посоветовал вам использовать (в качестве разделителя, а не так, =как если бы вы использовали, (тогда сортировка может начаться численно с самой начальной точки второго поля ..
heemayl
Да, лучше использовать '(' чем '='. Я помню, что пытался использовать оба '(' и ')' в качестве разделителей одновременно, но безуспешно и в то время отказался от использования скобок ...
roygvib
5

Попробуй это. Устанавливает разделитель на =, а затем использует поле 2 начиная с символа 2 и далее (игнорируя «(»).

sort -t= -k 2.2n file.txt
fn=(916) __universe_MOD_general_main
fn=(1368) __universe_MOD_general_boot
cfn=(1370) __lib_file_MOD_file_open
fn=(6142) __grid_var_MOD_get_overlap

Или даже

sort -t\( -k 2n <foo
fn=(916) __universe_MOD_general_main
fn=(1368) __universe_MOD_general_boot
cfn=(1370) __lib_file_MOD_file_open
fn=(6142) __grid_var_MOD_get_overlap
Стив
источник
1
хм .. это тоже работает как положено. Приятно осознавать, что некоторых персонажей можно пропустить. Большое спасибо :)
Ройгвиб