Saya ingin menyortir file sesuai dengan nomor dalam nama file. Berikut adalah file-filenya:
$ ls *.f
0.f 13.f 1.f 22.f 4.f abc.f
Hasil penyortiran:
$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f
Apa yang saya harapkan adalah:
$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f
Mengapa abc.f
diperlihatkan setelah 0.f
dan sebelum 1.f
? Apakah karena 0
tidak diperlakukan sebagai angka oleh sort
? Saya mencari di web dan tidak menemukan referensi.
LC_ALL=C
.Jawaban:
Alasannya adalah karena ketika menggunakan pengurutan numerik, string tanpa angka diperlakukan sebagai nol. GNU sort mendapatkan perilaku yang benar, tetapi tidak memberikan komentar mengapa. Halaman manual tentang illumos untuk jenis SunOS memang memberikan penjelasan:
Perilaku ini juga ditentukan dalam SUSv4 dan POSIX.1-2008 ( http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html ), menggunakan verbiage yang sama dengan halaman manual illumos.
GNU sort juga memiliki
-g
, "general numeric sort", yang mengurutkan berdasarkan angka floating point alih-alih bilangan bulat di mana string digit kosong diurutkan sebelum nol. Saya tidak yakin apakah ini efek samping atau disengaja. Namun,-g
datang dengan peringatan karena secara signifikan lebih lambat daripada-n
. Jika Anda menyortir kumpulan data besar atau melakukan apa pun yang ditunggu pengguna, Anda harus menghindari-g
.sumber
sort
penawaran dengan dua garis memiliki kunci yang sama.Anda bisa menggunakan -g
sumber