2014-10-13 15 views
5

Tôi đã cố gắng một cách tuyệt vọng để sử dụng lệnh sort, để sắp xếp một hỗn hợp ra các giá trị khoa học và nổi mà là cả tích cực và tiêu cực, ví dụ:Sắp xếp khoa học và nổi

-2.0e+00 
2.0e+01 
2.0e+02 
-3.0e-02 
3.0e-03 
3.0e-02 

Nếu không có dấu chấm động hoặc không có số mũ khoa học, nó hoạt động tốt với sort -k1 -g file.dat. Sử dụng cả hai cùng một lúc như đã nêu trước đó, nó kết quả trong:

-3.0e-02 
-2.0e+00 
2.0e+01 
2.0e+02 
3.0e-02 
3.0e-03 

Đây là rõ ràng là sai vì nó nên là:

-2.0e+00  
-3.0e-02 
3.0e-03 
3.0e-02 
... 

Bất kỳ ý tưởng làm thế nào tôi có thể giải quyết vấn đề này? Và khi tôi giải quyết vấn đề này, liệu có khả năng nào để sắp xếp giá trị tuyệt đối (ví dụ: loại bỏ các giá trị âm)? Tôi biết tôi có thể cố gắng để vuông mỗi giá trị, sắp xếp, lấy căn bậc hai. Làm điều này tôi sẽ ít chính xác hơn và nó sẽ gọn gàng để có một cách tốt đẹp, nhanh chóng và đơn giản.

Hệ thống linux của tôi: 8.12, Bản quyền © 2011

Cảm ơn bạn rất nhiều!

UPDATE: nếu tôi chạy nó trong chế độ gỡ lỗi sort -k1 -g filename.dat --debug tôi nhận được kết quả như sau (tôi dịch nó sang tiếng Anh, sản lượng đã được Đức)

sort: the sorting rules for „de_DE.UTF-8" are used 
sort: key 1 is numerically and involves several fields 
-3.0e-02 
__ 
________ 
-2.0e+00 
__ 
________ 
2.0e+01 
_ 
_______ 
2.0e+02 
_ 
_______ 
3.0e-02 
_ 
_______ 
3.0e-03 
_ 
_______ 
+0

không phải là "sai". nó chỉ phân loại thành một chuỗi. '-n' có thể giúp, mặc dù tôi không biết nếu nó sẽ xử lý các giá trị float. –

+0

@MarcB: Lưu ý rằng anh * bằng * sử dụng phân loại số ('-g') để bắt đầu. – DevSolar

+0

yep, [-n] cũng không tạo ra kết quả chính xác, đã thử kết quả trước – Jan

Trả lời

1

Dựa trên ý kiến ​​dưới câu hỏi, đây là một vấn đề địa phương : sort đang sử dụng ngôn ngữ, có nghĩa là , làm dấu phân cách thập phân, trong khi văn bản của bạn có .. Giải pháp lý tưởng sẽ làm cho sort sử dụng một ngôn ngữ khác, và hy vọng ai đó sẽ viết một câu trả lời đúng bao gồm điều đó.

Nhưng nếu bạn không thể hoặc không muốn thay đổi cách hoạt động của sort thì bạn có thể thay đổi dữ liệu nhập. Điều này là dễ nhất bằng cách làm cho sort lấy đầu vào của nó từ đường ống và sửa đổi nó trên đường đi. Ở đây nó là đủ để thay đổi mỗi .-,, vì vậy các công cụ của sự lựa chọn là tr:

cat file.dat | tr . , | sort -k1 -g 

Giải pháp này có một nhược điểm lớn: nếu lệnh được thực thi với locale nơi sắp xếp sử dụng . phân số thập phân, sau đó thay vì sửa chữa, điều này sẽ phá vỡ việc phân loại. Vì vậy, nếu bạn đang viết một kịch bản shell, có thể được sử dụng ở nơi khác, không làm điều này.

Lưu ý quan trọng: Lệnh trên có unnecessary use of cat. Tất cả những ai muốn mình được coi trọng như những lập trình viên kịch bản chuyên nghiệp, đừng làm thế!

+0

Bạn có thể loại bỏ UUoc bằng 'tr., fedorqui

Các vấn đề liên quan