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