Menyortir file dengan integer dalam tanda kurung tanpa spasi

8

Saya mencoba mengurutkan file seperti ini (yang merupakan daftar nama subrutin)

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

sesuai dengan integer di dalam tanda kurung. Saya pertama kali mencoba perintah sortir sebagai

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

tapi kemudian fn = (916) muncul di akhir ouput.

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

tetapi saya ingin angka-angka yang akan disortir dalam urutan meningkat (916 -> 1368 -> 1370 -> ...) Apakah mungkin untuk melakukan ini secara relatif hanya dengan menggunakan beberapa perintah atau opsi?

roygvib
sumber
... ada hubungannya ?
mikeserv
@mikeserv char favorit saya -> bernyanyi bunga matahari -> matahari -> spektrum :)
roygvib

Jawaban:

8

Bagaimana tentang:

sort -nt'(' -k2 file.txt

Uji :

$ 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 menandakan kita sedang mengurutkan angka

  • t'(' menetapkan pembatas sebagai (

  • -k2menetapkan kunci sortsebagai bidang kedua yaitu mulai dari digit ke akhir baris.

heemayl
sumber
oooooh melampirkan -n berfungsi ... Saya membaca halaman manual dan mencoba -n sebelumnya, tetapi tidak berhasil pada waktu itu ... tapi sekarang kombinasi di atas berfungsi dengan baik. Terima kasih banyak :)
roygvib
@roygvib saya akan menyarankan Anda untuk menggunakan (sebagai pembatas alih-alih =seolah-olah Anda gunakan (maka penyortiran dapat dimulai secara numerik dari titik paling awal dari bidang kedua ..
heemayl
Ya, seharusnya lebih baik menggunakan '(' daripada '='. Saya ingat saya mencoba menggunakan keduanya '(' dan ')' sebagai pembatas secara bersamaan tetapi tidak berhasil dan menyerah menggunakan tanda kurung pada waktu itu ...
roygvib
5

Coba ini. Set pembatas ke =, dan kemudian menggunakan bidang 2 dari karakter 2 dan seterusnya (mengabaikan "(").

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

Atau bahkan

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
sumber
1
hmm .. ini juga berfungsi seperti yang diharapkan. Sangat menyenangkan mengetahui bahwa beberapa karakter dapat dilewati. Terima kasih banyak :)
roygvib