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

8

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

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 número inteiro entre parênteses. Eu tentei pela primeira vez o comando de classificação como

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 gostaria que os números fossem classificados em ordem crescente (916 -> 1368 -> 1370 -> ...) É possível fazer isso de maneira relativamente simples usando vários comandos ou opções?

roygvib
fonte
... alguma relação ?
mikeserv
@mikeserv meu char favorito -> cantando girassol -> sun -> espectro :)
roygvib

Respostas:

8

E se:

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 ordenando numericamente

  • t'(' define o delimitador como (

  • -k2define a chave sortcomo o segundo campo, ou seja, começando dos dígitos até o final da linha.

heemail
fonte
oooooh anexar -n funciona ... Eu li a página de manual e tentei -n antes, mas não funcionou naquele momento ... mas agora a combinação acima funciona perfeitamente. Muito obrigado :)
roygvib
@roygvib eu gostaria de sugerir que você use (como delimitador em vez de =como se usar (, em seguida, a classificação pode começar numericamente do ponto do segundo campo muito começando ..
heemayl
Sim, deve ser melhor usar '(' que '='. Lembro que tentei usar ambos '(' e ')' como delimitadores simultaneamente, mas sem sucesso, e desisti de usar parênteses naquele momento ...
roygvib
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é

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
Steve
fonte
1
hmm .. isso também funciona como esperado. É bom saber que alguns caracteres podem ser ignorados. Muito obrigado :)
roygvib