comm: tập tin không theo thứ tự sắp xếp


9

Tôi đã sử dụng commđể so sánh hai tập tin được sắp xếp. Mỗi dòng trong các tệp này là số nguyên dương. Nhưng kết quả cho thấy

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

Làm thế nào đến lỗi ngay cả khi hai tập tin được sắp xếp?


Trong trường hợp của tôi, tôi đã sắp xếp (từ vựng tăng dần) các tệp bằng notepad ++, xem xét các chữ cái chữ thường và chữ hoa viết hoa riêng biệt, ví dụ. a sẽ xuất hiện sau 'Z' theo thứ tự tăng dần. Điều này khác với cách sắp xếp tiện ích (bash). Để xác minh điều này, tôi đã chuyển đổi tất cả các dòng thành chữ hoa và sau đó được sắp xếp trong np ++, comm không còn phàn nàn nữa.
Sahil Singh

Câu trả lời:


10

commyêu cầu sắp xếp từ vựng (đơn giản sort), không phải sắp xếp số ( sort -n). Ví dụ, nó muốn theo thứ tự sau:

1
2000
300

Không theo thứ tự sau:

1
300
2000

Sửa lỗi này và vấn đề sẽ biến mất. Đối với trường hợp bí truyền hơn nơi comm's locale có thể khác với các sortđịa phương, bạn có thể muốn chạy sortcommvới LC_COLLATE=Ctrong môi trường của họ để sử dụng có nguồn gốc trật tự byte.


Làm thế nào để làm cho nó sắp xếp số?
wenzi


" Đặt hàng từ điển " là nơi một loạt các số TĂNG trong một nhà máy được đặt hàng - bạn đã nhận được nó ngược trong câu trả lời của bạn: mathworld.wolfram.com/LexicographicOrder.html . Vui lòng tham khảo kết quả kiểm tra câu trả lời dưới đây của tôi mà so sánh sử dụng sort với , và không có sự -nchuyển đổi và chứng minh chỉ với các -ncông tắc bạn có thể đạt được đúng tăng theo thứ tự bạn nhận được yêu cầu trong câu trả lời của riêng bạn.
F1Linux

@ F1Linux là gì? commnghĩa đen yêu cầu LC_COLLATEd đặt hàng. Chỉ cần nói rằng các lỗi trong câu trả lời của bạn không hoàn toàn là mỹ phẩm cho các ví dụ bên ngoài bộ kiểm tra của bạn ... không ai yêu cầu sắp xếp số dương.
Chris Xuống

@ChrisDown Câu trả lời của bạn mà tôi đã trả lời - không phải câu tôi thấy bạn vừa chỉnh sửa và chỉ NGAY BÂY GIỜ đề cập " LC_COLLATE " là: " comm muốn sắp xếp theo kiểu chữ, không phải là số. Hãy sửa lỗi này và vấn đề sẽ biến mất. " trong đó có bất cứ điều gì về "LC_COLLATE", thứ rất khác với loại "_Lexographic". Thật vậy, câu trả lời ban đầu của bạn rất thưa thớt khi chỉ đơn thuần là một dòng KHÔNG CÓ BÀI TẬP đó là điều khiến tôi phải xem lại câu hỏi bằng câu trả lời của riêng mình. Tôi nâng cao câu trả lời được cập nhật của bạn vì "LC_COLLATE" chắc chắn hoạt động ở đây như bạn đã lưu ý.
F1Linux

0

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 -ntắc với sortlệ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ề commcó thể rất khác nhau:

Thuật ngữ học : Việc sử dụng công -ntắ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 commchuyển đổi `s--nocheck-order

Thứ tự Byte : KHÔNG sử dụng -n switchvới sort. LC_COLLATExá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 commmong đợi theo mặc định. Một chút về LC_COLLATEcó thể được tìm thấy ở đây: Reference1Reference2

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,commsẽ 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-nchuyể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ácsortlệ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 -ncô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 commlệnh với và không, -nchuyể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ó -nchuyể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 commmà không cần -nchuyể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ó -nchuyể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ư commkhông có công -ntắ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 -nlà 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 commkhông có nghĩa là kết quả được trả về bằng cách sử dụng -nchuyển đổi với commsai. Thật vậy, sử dụng comm -ntrả 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.


Câu trả lời được bình chọn hàng đầu đề cập rằng "comm muốn sắp xếp từ vựng", nhưng bạn dường như sắp xếp theo số. Có vẻ như nó sẽ rơi trong một số trường hợp.
dhag

Kiểm tra lại với các số sắp xếp khác nhau về số lượng và từ vựng, chẳng hạn như 1000, 200, 30, 4.
Kusalananda

@Kusalananda Chỉ cần kết hợp phản hồi rất tử tế và hữu ích của bạn trong câu trả lời cập nhật của tôi. Hầu hết bắt buộc cho phản hồi của bạn!
F1Linux

@dhag vừa cập nhật câu trả lời của tôi để kết hợp phản hồi của bạn & Kusalanada. Hầu hết bắt buộc đối với các bạn dành thời gian và nỗ lực để xem lại câu trả lời của tôi-
F1Linux

1
@JeffSchaller Câu trả lời ban đầu tôi trả lời đã đề cập đến loại "Thuật ngữ học", chứ không phải "LC_COLLATE" như trong câu trả lời mới được sửa đổi của Chris. Tôi đã trả lời Chris rằng đó là chính xác và nâng cao câu trả lời cập nhật của anh ấy. "Thuật ngữ học" & "LC_COLLATE" là những con thú khác nhau. Cảm ơn Jeff-
F1Linux
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.