Classificando um arquivo com inteiro entre parênteses sem espaço

8

Estou tentando classificar um arquivo como este (que é uma lista de nomes de sub-rotina)

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
...

de acordo com o inteiro entre parênteses. Eu tentei pela primeira vez o comando sort as

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

mas então fn = (916) vem no final da saída.

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

mas eu gostaria que os números fossem ordenados em ordem crescente (916 - > 1368 - > 1370 - > ...) É possível fazer isto de forma relativamente simples usando vários comandos ou opções?

    
por roygvib 11.07.2015 / 21:39

2 respostas

8

Que tal:

sort -nt'(' -k2 file.txt

Teste:

$ 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 indica que estamos classificando numericamente

  • t'(' define o delimitador como (

  • -k2 define a chave para sort como o segundo campo, ou seja, a partir dos dígitos até o final da linha.

por 11.07.2015 / 21:44
5

Tente isso. Define o delimitador como = e, em seguida, usa o campo 2 do caractere 2 em diante (ignorando o "(").

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

Ou até mesmo

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
    
por 11.07.2015 / 21:51

Tags