Cara mengurutkan file berdasarkan pada bagian bidang

11

Saya ingin menyortir file:

   D104HN-D104HA      8.320      4.521   1.69e+05 -- 
   D104HN-D104HB*      8.320      2.823   2.93e+05 -- 
   A90HB#-A90HA      1.655      4.207   7.12e+05 -- 
   A90HB#-F91HA      1.653      4.411   8.59e+04 -- 
   A114HB#-A114HA      1.253      4.098   7.67e+05 -- 
   A114HB#-R111HA      1.251      3.929   1.76e+05 -- 
   A114HB#-W110HA      1.253      4.451   3.68e+04 -- 
   F91HE*-F91HZ      7.237      7.122   7.85e+05 -- 
     F91HE*-K92HA      7.242      3.910   4.88e+04 -- 

dan dapatkan ini

   A90HB#-A90HA      1.655      4.207   7.12e+05 -- 
   A90HB#-F91HA      1.653      4.411   8.59e+04 -- 
   F91HE*-F91HZ      7.237      7.122   7.85e+05 -- 
   F91HE*-K92HA      7.242      3.910   4.88e+04 -- 
   D104HN-D104HA      8.320      4.521   1.69e+05 -- 
   D104HN-D104HB*      8.320      2.823   2.93e+05 -- 
   A114HB#-A114HA      1.253      4.098   7.67e+05 -- 
   A114HB#-R111HA      1.251      3.929   1.76e+05 -- 
   A114HB#-W110HA      1.253      4.451   3.68e+04 -- 

Yaitu, urutkan secara numerik pada karakter kedua dan berikut dari urutan pertama yang tidak kosong pada baris.

edith
sumber
ternyata editor tidak menyimpan format yang saya gunakan untuk file ....
edith
Sudahkah Anda mencoba sortperintahnya?
Eric Renouf
ya, tapi ternyata saya tidak tahu bagaimana saya menggunakannya dengan benar .... Saya mencoba: sort -b + 0.1n -1 tetapi juga sort -n -k1,1 -k1,4 (dan lebih banyak lainnya) tetapi tidak ada mereka yang bekerja
edith
1
Anda ingin mengurutkan berdasarkan nomor mulai dari karakter kedua?
pfnuesel
persis. masalahnya adalah bahwa dalam file tersebut, ada jumlah kosong yang berbeda sebelum bidang pertama
edith

Jawaban:

19
sort -k 1.2bn < file

Macam numerically pada key dimulai dengan 2nd karakter 1st bidang mengabaikan terkemuka bLanks (dan berakhir di akhir baris, tapi itu tidak masalah untuk semacam numerik yang hanya mempertimbangkan urutan awal angka desimal).

Perhatikan bahwa jika ada dasi, seperti di antara dua baris ini:

    F91HE*-K92HA      7.242      3.910   4.88e+04 --
  F91HE*-F91HZ      7.237      7.122   7.85e+05 --

Kemudian, pesanan akan didasarkan pada jenis resor terakhir yang membandingkan dua baris sepenuhnya sebagai string.

Dengan beberapa lokal, kosong akan diabaikan pada contoh pertama untuk membandingkan string dalam hal mana F91 yang akan datang sebelum K92 (seperti Fsebelumnya K). Dengan yang lain seperti di C locale, blank tidak akan diabaikan dan K92 kemudian akan datang sebelum F91 (space sorts before F).

Untuk jenis usaha terakhir yang akan mengabaikan kekosongan utama terlepas dari lokalnya, Anda dapat melakukan:

sort -k 1.2bn -k 1b < file

Yang 1bsatu akan mengurutkan (berdasarkan ikatan pada kunci pertama) secara leksikal pada bagian dari baris yang dimulai dengan bidang pertama mengabaikan kekosongan terkemuka.

Stéphane Chazelas
sumber