Ordenar un archivo con un número entero entre paréntesis sin espacio

8

Estoy tratando de ordenar un archivo como este (que es una lista de nombres de subrutinas)

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 acuerdo con el número entero entre paréntesis. Primero probé el comando de clasificación como

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

pero luego fn = (916) viene al final de la salida.

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

pero me gustaría que los números se clasifiquen en orden creciente (916 -> 1368 -> 1370 -> ...) ¿Es posible hacer esto de manera relativamente simple usando varios comandos u opciones?

roygvib
fuente
... alguna relación ?
mikeserv
@mikeserv mi personaje favorito -> cantando girasol -> sol -> espectro :)
roygvib

Respuestas:

8

Qué tal si:

sort -nt'(' -k2 file.txt

Prueba :

$ 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 numéricamente

  • t'(' establece el delimitador como (

  • -k2establece la clave sortcomo el segundo campo, es decir, desde los dígitos hasta el final de la línea.

heemayl
fuente
oooooh adjuntar -n funciona ... Leí la página de manual y probé -n antes, pero no funcionó en ese momento ... pero ahora la combinación anterior funciona perfectamente. Muchas gracias :)
roygvib
@roygvib, le sugiero que use (como delimitador en lugar de =como si lo usara, (entonces la clasificación puede comenzar numéricamente desde el punto de partida del segundo campo ...
heemayl
Sí, debería ser mejor usar '(' que '='. Recuerdo que intenté usar '(' y ')' como delimitadores simultáneamente pero no
tuve
5

Prueba esto. Establece el delimitador en =, y luego usa el campo 2 desde el carácter 2 en adelante (ignorando el "(").

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

O incluso

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
fuente
1
hmm ... esto también funciona como se esperaba. Es bueno saber que se pueden omitir algunos caracteres. Muchas gracias :)
roygvib