CẬP NHẬT TRẢ LỜI:
VẤN ĐỀ:
OP đang nhận được lỗi về " tệp không theo thứ tự sắp xếp " khi sử dụng comm
để so sánh các số nguyên dương trong các tệp chứ không phải văn bản. Vì vậy, chúng tôi đang xử lý các số không thập phân.
Câu trả lời ngắn:
Tùy thuộc vào việc sử dụng công -n
tắc với sort
lệnh được sử dụng để sắp xếp kết quả được cung cấp comm
, thứ tự kết quả được trả về comm
có thể rất khác nhau:
Thuật ngữ học : Việc sử dụng công -n
tắc với sắp xếp sẽ dẫn đến "Số nguyên dương" được sắp xếp theo một loạt các số tăng dần. " Lỗi " có thể được loại bỏ bằng cách sử dụng comm
chuyển đổi `s--nocheck-order
Thứ tự Byte : KHÔNG sử dụng -n switch
với sort
. LC_COLLATE
xác định thứ tự thậm chí có thể thay đổi theo cách locale
đặt trên máy chủ nơi lệnh được thực thi. Đây là đầu vào comm
mong đợi theo mặc định. Một chút về LC_COLLATE
có thể được tìm thấy ở đây: Reference1 và Reference2
Là lỗi một vấn đề?
Điều đó phụ thuộc vào những gì bạn đang cố gắng để đạt được. Như bạn sẽ thấy trong ví dụ dưới đây,comm
sẽ trả về kết quả tương tự sau khi so sánh các tập tin với hoặc không có sort
`s-n
chuyển đổi, mặc dù đặt hàng của họ sẽ thay đổi theo cách trên tùy thuộc vào việc-n switch
được sử dụng với cácsort
lệnh. Bản thân tôi, tôi thích các kết quả theo thứ tự "từ vựng" hơn - số tăng theo chuỗi.
Tuy nhiên nếu bạn không muốn các kết quả trong " lexographic trật tự", sau đó làm KHÔNG sử dụng -n
công tắc khi sắp xếp dữ liệu cung cấp cho comm
để so sánh.
KIỂM TRA:
Chúng ta sẽ so sánh kết quả của comm
lệnh với và không, -n
chuyển đổi. Tôi đã tăng độ phức tạp của bộ dữ liệu thử nghiệm mẫu của tôi theo yêu cầu của Kusalananda:
Dữ liệu kiểm tra :
file1.txt :
40
110000
2200
6
33000
file2.txt :
2200
40
33000
6
440000
Giao lộ :
Chỉ liệt kê các số phổ biến cho các tệp BÓNG
Không có -n
chuyển đổi:
comm -12 <(sort file1.txt) <(sort file2.txt)
2200
33000
40
6
Kết quả : Đúng, nhưng được trả về theo thứ tự chưa được sắp xếp
VỚI công -n
tắc:
comm -12 <(sort -n file1.txt) <(sort -n file2.txt)
6
40
2200
33000
comm: file 1 is not in sorted order
Kết quả : Đúng, nhưng được trả về theo thứ tự sắp xếp LEXOGRAPHIC . Thao tác đã hoàn thành thành công và trả về kết quả giống như sử dụng comm
mà không cần -n
chuyển đổi, nhưng trong một danh sách được sắp xếp.
Sự khác biệt :
Chỉ liệt kê các số duy nhất cho mỗi tệp:
Không có -n
chuyển đổi:
comm -3 <(sort file1.txt) <(sort file2.txt)
110000
440000
Kết quả : Đúng- những con số này thực sự là độc quyền cho mỗi tệp tương ứng.
VỚI công -n
tắc:
comm -3 <(sort -n file1.txt) <(sort -n file2.txt)
110000
comm: file 1 is not in sorted order
440000
Kết quả : Đúng, kết quả giống như comm
không có công -n
tắc, nhưng trả về lỗi về thứ tự của các số nguyên dương không được sắp xếp trong các tệp.
GIẢI PHÁP CHO KẾT QUẢ TUYỆT VỜI:
Sử dụng công tắc comm
`s --nocheck-order
để chặn thông báo lỗi. Vì chúng tôi biết các số không được sắp xếp trong mỗi tệp nhưng kết quả trả về comm -n
là chính xác, lỗi có thể được bỏ qua một cách an toàn bằng cách loại bỏ nó:
Giao lộ :
comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)
6
40
2200
33000
Sự khác biệt :
comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)
110000
440000
PHẦN KẾT LUẬN:
Lỗi " tệp không theo thứ tự sắp xếp " khi trả về sắp xếp các số nguyên dương được cung cấp comm
không có nghĩa là kết quả được trả về bằng cách sử dụng -n
chuyển đổi với comm
sai. Thật vậy, sử dụng comm -n
trả về một chính xác gọn gàng theo thứ tự được sắp xếp!
Cảm ơn @dhag, @kusalananda @ChrisDown đã nêu ra các vấn đề cần mở rộng hơn nữa. Luôn vui mừng khi công việc của tôi được xem xét: cách duy nhất chúng ta có thể trở nên tốt hơn là nếu chúng ta liên tục bị thúc đẩy và thách thức bởi các đồng nghiệp của mình.