Mengapa catatan non-angka ditampilkan setelah “0” dalam penyortiran?


8

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.fdiperlihatkan setelah 0.fdan sebelum 1.f? Apakah karena 0tidak diperlakukan sebagai angka oleh sort? Saya mencari di web dan tidak menemukan referensi.


Masih sama setelah menambahkan LC_ALL=C.
nn0p

Jawaban:


12

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:

-n
Membatasi kunci sortir ke string numerik awal, yang terdiri dari karakter kosong opsional, tanda minus opsional, dan nol atau lebih digit dengan karakter radix opsional dan ribuan pemisah (sebagaimana didefinisikan dalam lokal saat ini), yang diurutkan berdasarkan nilai aritmatika . String digit kosong diperlakukan sebagai nol. Angka nol di depan dan tanda pada angka nol tidak mempengaruhi pemesanan.

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


Untuk kelengkapan Anda juga harus menyebutkan bagaimana sortpenawaran dengan dua garis memiliki kunci yang sama.
kasperd

1

Anda bisa menggunakan -g

-g, --general-numeric-sort membandingkan menurut nilai numerik umum

root@virt01-ubuntu:~# ls  | sort -t. -k1g
a.txt
0.txt
1.txt
2.txt
3.txt
root@virt01-ubuntu:~#
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.