Sortieren einer Datei mit einer Ganzzahl in Klammern ohne Leerzeichen

8

Ich versuche, eine Datei wie diese zu sortieren (dies ist eine Liste von Unterprogrammnamen).

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

entsprechend der Ganzzahl in Klammern. Ich habe zuerst den Sortierbefehl als versucht

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

aber dann kommt fn = (916) am Ende der Ausgabe.

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

Ich möchte jedoch, dass die Zahlen in aufsteigender Reihenfolge sortiert werden (916 -> 1368 -> 1370 -> ...). Ist dies relativ einfach mit mehreren Befehlen oder Optionen möglich?

Roygvib
quelle
... irgendeine Beziehung ?
Mikeserv
@mikeserv mein Lieblingschar -> singende Sonnenblume -> Sonne -> Spektrum :)
Roygvib

Antworten:

8

Wie wäre es mit:

sort -nt'(' -k2 file.txt

Prüfung :

$ 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 zeigt an, dass wir numerisch sortieren

  • t'(' Setzt das Trennzeichen auf (

  • -k2Setzt den Schlüssel auf sortdas zweite Feld, dh von den Ziffern bis zum Ende der Zeile.

heemayl
quelle
oooooh das Anhängen von -n funktioniert ... Ich habe die Manpage gelesen und -n zuvor versucht, aber es hat zu diesem Zeitpunkt nicht funktioniert ... aber jetzt funktioniert die obige Kombination perfekt. Vielen Dank :)
Roygvib
@roygvib Ich würde vorschlagen, dass Sie (als Trennzeichen verwenden, anstatt =als ob Sie (dann verwenden, dann kann die Sortierung numerisch vom Anfangspunkt des zweiten Feldes beginnen ..
heemayl
Ja, es sollte besser sein, '(' als '=' zu verwenden. Ich erinnere mich, dass ich versucht habe, sowohl '(' als auch ')' gleichzeitig als Begrenzer zu verwenden, aber keinen Erfolg hatte und zu diesem Zeitpunkt auf die Verwendung von Klammern verzichtete ...
roygvib
5

Versuche dies. Setzt das Trennzeichen auf = und verwendet dann Feld 2 ab Zeichen 2 (wobei das "(") ignoriert wird.

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

Oder auch

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
quelle
1
hmm .. das funktioniert auch wie erwartet. Es ist schön zu wissen, dass einige Zeichen übersprungen werden können. Vielen Dank :)
Roygvib