Hành vi sai của lệnh sort?


14

Tôi đã cố gắng sắp xếp nội dung của một tệp trong máy tính để bàn Ubuntu 14.04 (Trusty Tahr). Trong trường hợp của tôi, kết quả mong đợi sẽ giống như nội dung ban đầu, nhưng kết quả thực tế thì không. Tại sao?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c

4
Tôi trao cho bạn một chiếc cúp giải thưởng nhỏ cho việc sử dụng vô dụng của bạncat .
David foerster

3
Nhận xét của @DavidFoerster là một cách thú vị để chỉ ra rằng bạn có thể thay thế cat test.txt | sortbằng sort test.txt:)
Volker Siegel

@VolkerSiegel: Đúng, mặc dù có những công thức hữu ích sử dụng catđể bắt đầu. Ví dụ: cat FILE | grep dev | sortsẽ chỉ hiển thị các dòng có "dev" trong đó (theo thứ tự được sắp xếp). Sử dụng sort FILE | grep devtạo ra cùng một đầu ra nhưng màu.
AlainD

Câu trả lời:


17

Bạn có thể sử dụng LC_ALLbiến, đặt nó LC_ALL=Ctrước khi gọisort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

Đọc câu trả lời này , nếu bạn muốn biết điều này là kỳ diệu LC_ALL=C. Dưới đây là tóm tắt ngắn gọn:

Địa điểm C là một địa phương đặc biệt có nghĩa là địa phương đơn giản nhất. Bạn cũng có thể nói rằng trong khi các địa phương khác dành cho con người, thì ngôn ngữ C dành cho máy tính. Trong miền địa phương C, các ký tự là các byte đơn, bộ ký tự là ASCII, thứ tự sắp xếp dựa trên các giá trị byte.

Ngoài ra, như @KenMollerup đã chỉ, trích dẫn từ man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

Vì vậy, khi sử dụng sort với LC_ALL=C, sắp xếp so sánh các biểu tượng bytewise. Nếu không sortsẽ bỏ qua tất cả các ký tự không chữ và số.


Xin lỗi đã không nhìn thấy điều này, tôi đã phản ứng với các bình luận!
Ken Mollerup 17/03/2015

@KenMollerup cảm ơn bạn đã chỉ đến man sort. Tôi đã không nhận ra điều đó
c0rp 17/03/2015

8

Sắp xếp sử dụng sắp xếp theo thứ tự chữ cái và số, giống như chúng tôi, các ký tự đặc biệt như + - <> ... bị bỏ qua, các số được xử lý bằng số nên 1, 2, 3 .. xuất hiện trước 11, 12 1066 1104 - xem!

Vì vậy, danh sách của bạn được xem là: aa, ab, ab, ac, ac


Có tùy chọn nào để sắp xếp, sao cho nó sẽ không bỏ qua các ký tự đặc biệt sao cho test.txt sẽ sắp xếp theo cách mong muốn?
Doug Smythies 17/03/2015

6
Xem phần này trong man sort: *** CẢNH BÁO *** Vị trí được chỉ định bởi môi trường ảnh hưởng đến thứ tự sắp xếp. Đặt LC_ALL = C để nhận thứ tự sắp xếp truyền thống sử dụng các giá trị byte gốc.
Ken Mollerup 17/03/2015

@KenMollerup, vui lòng thêm thông tin vào câu trả lời của bạn. Thêm trích dẫn từ man sort, thêm ví dụ.
c0rp 17/03/2015

Có nhưng tôi đã chậm, xem câu trả lời của c0rp bên dưới.
Ken Mollerup 17/03/2015
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.