2009-07-26 37 views
13

Tôi có hai máy linux, trên đó sắp xếp unix dường như hoạt động khác nhau. Tôi tin rằng tôi đã thu hẹp nó xuống để điều trị nhân vật gạch dưới.Xử lý sắp xếp Unix của ký tự gạch dưới

Nếu tôi chạy sort tmp, nơi tmp chứa hai dòng sau:

aa_d_hh 
aa_dh_ey 

một kết quả đầu ra máy

aa_d_hh 
aa_dh_ey 

(tức là '_' đến trước 'h') trong khi đầu ra khác

aa_dh_ey 
aa_d_hh 

(tức là 'h' trước '_'). Tôi cần những máy này để hành xử cùng nhau (vì tôi sử dụng sắp xếp -m sau này, để hợp nhất các tệp rất lớn).

Có cách nào tôi có thể buộc sắp xếp để hành xử theo cách này hay cách khác không?

Cảm ơn.

+0

thử sắp xếp - đảo ngược trên cả hai máy .. chúng giống nhau không ?? – sud03r

Trả lời

15

Bạn có thể đặt LC_COLLATE đến thứ tự sắp xếp truyền thống chỉ cho lệnh của bạn:

env LC_COLLATE=C sort tmp 

này sẽ không thay đổi môi trường hiện tại chỉ là một trong đó lệnh sắp xếp thực hiện. Bạn nên có hành vi tương tự với điều này.

+0

Một số lựa chọn hợp lệ khác của LC_COLLATE là gì? Giả sử tôi đặc biệt muốn di chuyển dưới dấu gạch dưới? Giá trị nào sẽ làm điều đó? –

+0

'LC_COLLATE = en_US.ASCII' là một lựa chọn hợp lệ khác, có cùng thứ tự sắp xếp cho dấu gạch dưới là' C'. –

3

thứ tự sắp xếp tùy thuộc vào giá trị hiện tại của biến môi trường LC _ COLLATE. Kiểm tra tài liệu địa phương của bạn cho 'locale', 'setlocale', v.v. Đặt LC _ COLLATE thành 'POSIX' trên cả hai máy và kết quả sẽ khớp nhau.

+0

không có biến môi trường như vậy trên máy của tôi, nhưng sắp xếp hoạt động tốt. – sud03r

0

Sự khác biệt là do số locale của bạn. Sử dụng lệnh locale để kiểm tra cài đặt hiện tại.

Có một số danh mục ngôn ngữ khác nhau, chẳng hạn như LC_COLLATE, LC_TIMELC_MESSAGES. Bạn có thể thay đổi tất cả bằng cách đặt biến môi trường LC_ALL hoặc LANG hoặc chỉ thứ tự sắp xếp (sắp xếp) bằng cách đặt biến môi trường LC_COLLATE. Ngôn ngữ C hoặc POSIX là ngôn ngữ cơ bản được xác định theo tiêu chuẩn; những người khác bao gồm en_US (tiếng Anh-Mỹ), fr_FR (tiếng Pháp) vv

0

Điều này có thể do sự khác biệt về ngôn ngữ. Trong ngôn ngữ en_US.UTF-8, dấu gạch dưới (_) sắp xếp sau chữ cái và số, trong khi ở các POSIX C locale chúng sắp xếp sau chữ hoa và số, nhưng trước số chữ thường.

# won't change LC_COLLATE=C after execution 
$ LC_COLLATE=C sort filename 

Bạn cũng có thể sử dụng sort --debug để hiển thị thêm thông tin về hành vi sắp xếp nói chung:

$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') | 
     LC_COLLATE=en_US.UTF-8 sort --debug 
sort: using ‘en_US.UTF-8’ sorting rules 
foo0bar 
fooabar 
fooAbar 
foo_bar 

$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') | 
     LC_COLLATE=C sort --debug 
sort: using simple byte comparison 
foo0bar 
fooAbar 
foo_bar 
fooabar 

Như cũng thể hiện trong this answer, bạn có thể sử dụng công thức trên để buộc LC_COLLATE=C cho một lệnh duy nhất, mà không sửa đổi môi trường vỏ của bạn:

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