GNU/Linux >> Belajar Linux >  >> Linux

Mencoba Mengurutkan Pada Dua Bidang, Kedua Lalu Pertama?

Saya mencoba mengurutkan pada beberapa kolom. Hasilnya tidak seperti yang diharapkan.

Ini data saya (people.txt):

Simon Strange 62
Pete Brown 37
Mark Brown 46
Stefan Heinz 52
Tony Bedford 50
John Strange 51
Fred Bloggs 22
James Bedford 21
Emily Bedford 18
Ana Villamor 44
Alice Villamor 50
Francis Chepstow 56

Berikut ini berfungsi dengan benar:

bash-3.2$ sort -k2 -k3 <people.txt                                                                                                                    
Emily Bedford 18                                                                                                                                      
James Bedford 21                                                                                                                                      
Tony Bedford 50                                                                                                                                       
Fred Bloggs 22                                                                                                                                        
Pete Brown 37                                                                                                                                         
Mark Brown 46                                                                                                                                         
Francis Chepstow 56                                                                                                                                   
Stefan Heinz 52                                                                                                                                       
John Strange 51                                                                                                                                       
Simon Strange 62                                                                                                                                      
Ana Villamor 44                                                                                                                                       
Alice Villamor 50

Namun, berikut ini tidak berfungsi seperti yang diharapkan:

bash-3.2$ sort -k2 -k1 <people.txt                                        
Emily Bedford 18                                                                                                                                      
James Bedford 21                                                                                                                                      
Tony Bedford 50                                                                                                                                       
Fred Bloggs 22                                                                                                                                        
Pete Brown 37                                                                                                                                         
Mark Brown 46                                                                                                                                         
Francis Chepstow 56                                                                                                                                   
Stefan Heinz 52                                                                                                                                       
John Strange 51                                                                                                                                       
Simon Strange 62                                                                                                                                      
Ana Villamor 44                                                                                                                                       
Alice Villamor 50

Saya mencoba mengurutkan berdasarkan nama belakang dan kemudian dengan nama depan, tetapi Anda akan melihat Villamors tidak dalam urutan yang benar. Saya berharap untuk mengurutkan berdasarkan nama keluarga, dan kemudian ketika nama keluarga cocok, untuk mengurutkan berdasarkan nama depan.

Sepertinya ada sesuatu tentang bagaimana ini seharusnya bekerja, saya tidak mengerti. Saya bisa melakukan ini dengan cara lain tentu saja (menggunakan awk), tetapi saya ingin memahami sort.

Saya menggunakan shell Bash standar di Mac OS X.

Jawaban yang Diterima:

Spesifikasi kunci seperti -k2 berarti memperhitungkan semua bidang dari 2 hingga akhir baris. Jadi Villamor 44 berakhir sebelum Villamor 50 . Karena keduanya tidak sama, perbandingan pertama di sort -k2 -k1 cukup untuk membedakan dua baris ini, dan kunci sortir kedua -k1 tidak dipanggil. Jika kedua Villamors memiliki usia yang sama, -k1 akan menyebabkan mereka diurutkan berdasarkan nama depan.

Untuk mengurutkan berdasarkan satu kolom, gunakan -k2,2 sebagai spesifikasi utama. Ini berarti menggunakan kolom dari #2 hingga #2, yaitu hanya kolom kedua.

sort -k2 -k3 <people.txt berlebihan:ini setara dengan sort -k2 <people.txt . Untuk mengurutkan berdasarkan nama belakang, lalu nama depan, lalu usia, jalankan perintah berikut:

sort -k2,2 -k1,1 <people.txt

atau setara dengan sort -k2,2 -k1 <people.txt karena hanya ada tiga bidang ini dan pemisahnya sama. Bahkan, Anda akan mendapatkan efek yang sama dari sort -k2,2 <people.txt , karena sort menggunakan seluruh baris sebagai upaya terakhir ketika semua kunci dalam subset baris identik.

Terkait:Bagaimana cara mengambil teks dalam file dan menampilkan paragraf yang memiliki teks?

Perhatikan juga bahwa pemisah bidang default adalah transisi antara yang tidak kosong dan yang kosong, jadi kuncinya akan menyertakan bagian yang kosong di depan (dalam contoh Anda, untuk baris pertama, kunci pertama adalah "Emily" , tapi kunci kedua " Bedford" . Tambahkan -b opsi untuk menghapus bagian yang kosong:

sort -b -k2,2 -k1,1

Ini juga dapat dilakukan per-kunci dengan menambahkan b tandai di akhir spesifikasi awal kunci:

sort -k2b,2 -k1,1 <people.txt

Tetapi sesuatu yang perlu diingat:segera setelah Anda menambahkan satu flag tersebut ke spesifikasi kunci, flag global (seperti -n , -r ...) tidak lagi berlaku untuk mereka, jadi sebaiknya hindari pencampuran flag per-key dan flag global.


Linux
  1. Bagaimana Memilih Kejadian Pertama Antara Dua Pola Termasuk Mereka?

  2. Beralih ke Sesi X Kedua Membunuh Yang Pertama?

  3. Bagaimana Membandingkan Dua File Dan Kemudian Menambahkan Baris Yang Tidak Cocok Sebagian?

  1. Urutkan Berdasarkan Nilai Hex?

  2. Lum – Ganti Nilai Umum Dalam Dua File Menurut Kolom Pertama?

  3. Menyortir dalam bash

  1. Membandingkan dua daftar yang tidak disortir di linux, mencantumkan yang unik di file kedua

  2. Bagaimana saya bisa mendapatkan kata-kata di antara dua contoh teks/pola pertama?

  3. Bagaimana cara mengurutkan berdasarkan ekstensi file dan kemudian nama?