Tại sao bản ghi không số hiển thị sau khi 0 0 trong sắp xếp?


8

Tôi muốn sắp xếp các tập tin theo số trong tên tệp. Dưới đây là các tập tin:

$ ls *.f
0.f  13.f  1.f  22.f  4.f  abc.f

Kết quả phân loại:

$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f

Những gì tôi đã mong đợi là:

$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f

Tại sao được abc.fhiển thị ngay sau 0.fvà trước 1.f? Có phải vì 0không được coi là một con số sort? Tôi đã tìm kiếm trên web và không tìm thấy bất kỳ tài liệu tham khảo.


Vẫn như vậy sau khi thêm LC_ALL=C.
nn0p

Câu trả lời:


12

Lý do là vì khi sử dụng sắp xếp số, các chuỗi không có số được coi là 0. GNU sort có hành vi đúng, nhưng không bình luận tại sao. Trang người đàn ông trên illumos cho SunOS sort cung cấp một lời giải thích:

-n
Hạn chế khóa sắp xếp thành một chuỗi số ban đầu, bao gồm các ký tự trống tùy chọn, dấu trừ tùy chọn và 0 hoặc nhiều chữ số với ký tự cơ số tùy chọn và hàng nghìn dấu phân cách (như được định nghĩa trong ngôn ngữ hiện tại), được sắp xếp theo giá trị số học . Một chuỗi chữ số trống được coi là số không. Số không và dấu hiệu hàng đầu trên số không không ảnh hưởng đến thứ tự.

Hành vi này cũng được chỉ định trong SUSv4 và POSIX.1-2008 ( http://pub.opengroup.org/onlinepub/9699919799/utilities/sort.html ), sử dụng cùng một verbiage như trang man illumos.

GNU sort cũng có -g"sắp xếp số chung", sắp xếp theo số dấu phẩy động thay vì số nguyên trong đó các chuỗi chữ số trống được sắp xếp trước 0. Tôi không chắc đây là tác dụng phụ hay cố ý. Tuy nhiên, -gđi kèm với một cảnh báo vì nó chậm hơn đáng kể so với -n. Nếu bạn sắp xếp một tập dữ liệu lớn hoặc làm bất cứ điều gì mà người dùng đang chờ đợi, bạn nên tránh -g.


Để hoàn thiện, bạn cũng nên đề cập đến cách sortgiao dịch với hai dòng có cùng khóa.
kasperd

1

bạn có thể sử dụng -g

-g, - so sánh tổng số-sắp xếp theo giá trị số chung

root@virt01-ubuntu:~# ls  | sort -t. -k1g
a.txt
0.txt
1.txt
2.txt
3.txt
root@virt01-ubuntu:~#
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.