Tôi muốn sắp xếp hai tệp nhưng tôi không thể có kết quả nhất quán. Có vẻ như có vấn đề với đối chiếu nhưng tôi không thể hiểu lý do. Trong phân cách tệp mẫu là một khoảng trắng:
tập tin1:
a
b
B
A
tập tin 2:
a 1
b 0
B 1
A 0
Tôi sử dụng sort -k1,1
để sắp xếp các tệp này và đầu ra là:
đã sắp xếp1:
a
A
b
B
đã sắp xếp2:
A 0
a 1
b 0
B 1
Tôi cần những tập tin được sắp xếp trong một join
và hiện đang phàn nàn rằng một trong những tập tin không được sắp xếp.
Trong môi trường của tôi LC_COLLATE
và LC_ALL
không được đặt, LANG
được đặt thànhen_US.UTF-8
Với LC_ALL=C sort -k1,1
đầu ra là:
đã sắp xếp11:
A
B
a
b
đã sắp xếp22:
A 0
B 1
a 1
b 0
Tôi không cần một đơn đặt hàng cụ thể, tôi chỉ muốn nó có thể tham gia kết quả. Cách này join
hoạt động. Để được an toàn tôi cũng có thể thêm vào trước join
với LC_ALL=C
.
Câu hỏi của tôi
Tại sao trong sorted1
a
là trước A
và trong sorted2
a
là sau A
? Dù đối chiếu là gì, nó dành cho cả hai sort
lệnh và tôi đang sắp xếp dựa trên cột 1 giống hệt nhau trong cả hai tệp đầu vào.
Đã thêm đầu ra của ltrace -e strcoll
tập tin1
sort->strcoll("B","A") =1
sort->strcoll("a","b") =-1
sort->strcoll("a","A") =-7
a
sort->strcoll("b","A") =1
A
sort->strcoll("b","B") =-7
b
B
+++ exited (status 0) +++
tập tin2
sort->strcoll("B 1","A 0") =1
sort->strcoll("a 1","b 0") =-1
sort->strcoll("a 1","A 0") =1
A 0
sort->strcoll("a 1","B 1) =-1
a 1
sort->strcoll("b 0","B 1") =-1
b 0
B 1
+++ exited (status 0) +++
\0
. Ví dụ với recode us..dump file
.
LC_ALL=C
Dù sao join
, bạn có thể muốn sử dụng , đặc biệt nếu tệp chứa các ký tự không phải ASCII vì tất cả các ngôn ngữ glibc UTF-8 đều có lỗi trong đó nhiều ký tự khác nhau và các thành phần đối chiếu giống nhau ở đó.