Ordinamento di un file con numero intero tra parentesi senza spazio


8

Sto cercando di ordinare un file come questo (che è un elenco di nomi di subroutine)

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

secondo il numero intero tra parentesi. Ho provato prima il comando sort come

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

ma poi fn = (916) arriva alla fine dell'uscita.

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

ma vorrei che i numeri fossero ordinati in ordine crescente (916 -> 1368 -> 1370 -> ...) È possibile farlo in modo relativamente semplice usando diversi comandi o opzioni?


... qualche relazione ?
Mikeserv,

@mikeserv il mio personaggio preferito -> canto girasole -> sole -> spettro :)
roygvib

Risposte:


8

Che ne dite di:

sort -nt'(' -k2 file.txt

Test:

$ 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 che stiamo ordinando numericamente

  • t'(' imposta il delimitatore come (

  • -k2imposta la chiave sortcome secondo campo, ovvero partendo dalle cifre fino alla fine della riga.


oooooh allegando -n funziona ... Ho letto la pagina man e ho provato -n prima, ma non ha funzionato in quel momento ... ma ora la combinazione sopra funziona perfettamente. Grazie mille :)
roygvib l'

@roygvib ti suggerirei di usare (come delimitatore invece che =come se usassi, (quindi l'ordinamento può iniziare numericamente dal punto di partenza del secondo campo ..
heemayl

Sì, dovrebbe essere meglio usare '(' di '='. Ricordo di aver provato a usare entrambi '(' e ')' come delimitatori contemporaneamente ma senza successo e ho rinunciato a usare le parentesi in quel momento ...
roygvib

5

Prova questo. Imposta il delimitatore su =, quindi utilizza il campo 2 dal carattere 2 in poi (ignorando "(").

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 anche

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
hmm .. funziona anche come previsto. È bello sapere che alcuni personaggi possono essere saltati. Grazie mille :)
roygvib l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.