Tri d'un fichier avec un entier entre parenthèses sans espace

8

J'essaie de trier un fichier comme celui-ci (qui est une liste de noms de sous-programmes)

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

selon l'entier entre parenthèses. J'ai d'abord essayé la commande de tri comme

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

mais alors fn = (916) vient à la fin de la sortie.

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

mais je voudrais que les nombres soient triés dans l'ordre croissant (916 -> 1368 -> 1370 -> ...) Est-il possible de le faire relativement simplement en utilisant plusieurs commandes ou options?

roygvib
la source
... une relation ?
mikeserv
@mikeserv mon personnage préféré -> tournesol chantant -> soleil -> spectre :)
roygvib

Réponses:

8

Que diriez-vous:

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 indique que nous trions numériquement

  • t'(' définit le délimiteur comme (

  • -k2définit la clé sortcomme deuxième champ, c'est-à-dire à partir des chiffres jusqu'à la fin de la ligne.

heemayl
la source
oooooh attacher -n fonctionne ... J'ai lu la page de manuel et essayé -n avant, mais cela ne fonctionnait pas à ce moment-là ... mais maintenant la combinaison ci-dessus fonctionne parfaitement. Merci beaucoup :)
roygvib
@roygvib je vous suggère d'utiliser (comme délimiteur plutôt =que comme si vous utilisiez (alors le tri peut commencer numériquement à partir du point de départ du deuxième champ ..
heemayl
Oui, il devrait être préférable d'utiliser '(' que '='. Je me souviens avoir essayé d'utiliser les deux '(' et ')' comme délimiteurs simultanément mais sans succès et j'ai abandonné les parenthèses à ce moment-là ...
roygvib
5

Essaye ça. Définit le délimiteur sur =, puis utilise le champ 2 à partir du caractère 2 (en ignorant le "(").

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 même

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
la source
1
hmm .. cela fonctionne aussi comme prévu. Il est bon de savoir que certains caractères peuvent être ignorés. Merci beaucoup :)
roygvib