tham gia: Tập tin 2 không theo thứ tự Sắp xếp


13

Tôi đã có hai tệp _jeter3.txt và _jeter1.txt

Tôi đã kiểm tra cả hai đều được sắp xếp trên cột thứ 20 bằng cách sử dụng sort -c

sort -t '     ' -c -k20,20 _jeter3.txt
sort -t '     ' -c -k20,20 _jeter1.txt
#no errors

nhưng có một lỗi khi tôi muốn joincả hai tập tin nói rằng tập tin thứ hai không được sắp xếp:

join -t '   ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order

Tôi không hiểu tại sao.

cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0

CẬP NHẬT : sử dụng ' sort -f' và join -i(cả hai trường hợp không nhạy cảm) khắc phục vấn đề. Nhưng nó không giải thích vấn đề ban đầu của tôi.

CẬP NHẬT : phiên bản sắp xếp & tham gia:

> join --version
join (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)

> sort --version
sort (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)

Bạn có thể cho chúng tôi đầu ra của "tham gia - đảo ngược" và "sắp xếp - đảo ngược" chỉ vì lợi ích hoàn toàn không? Tôi không thể nhận được một số phiên bản cũ hơn của gnu tham gia để đưa cho tôi thông báo lỗi đó trong mọi trường hợp.
Bruce Ediger

3
Vui lòng gửi một số dữ liệu mẫu thể hiện vấn đề và đầu ra của locale.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


25

Tôi đã gặp lỗi tương tự với Ubuntu 11.04, sortjoincả trong phiên bản (GNU coreutils) 8.5.

Chúng rõ ràng không tương thích. Trong thực tế, sortlệnh có vẻ bị lỗi: không có sự khác biệt nào với hoặc không có tùy chọn -f( --ignore-case). Khi sắp xếp, aaBluôn luôn là trước aBa. Các ký tự không phải chữ và số dường như cũng luôn bị bỏ qua ( abclà trước ab-x)

Tham gia dường như mong đợi điều ngược lại ... Nhưng tôi có một giải pháp

Trong thực tế, điều này được liên kết với trình tự đối chiếu: sử dụng LANG=en_EN sort -k 1,1 <myfile> ...sau đó LANG=en_EN join ...loại bỏ thông báo.

Quốc tế hóa là gốc rễ của cái ác ... (không ai có tài liệu rõ ràng).


Vì vậy, nếu cả hai sử dụng LANG=en_EN, thì nó chắc chắn sẽ làm việc? Nó sẽ hoạt động cho bất kỳ miền địa phương nào, miễn là cả hai sử dụng cùng một miền? Chúng ta có thể nói rằng sự khác biệt giữa sortjoinlà họ sử dụng một ngôn ngữ khác theo mặc định?
Aaron McDaid

-klựa chọn câu trả lời ở đây, hay nó là LANG=en_EN? Không rõ giải pháp chính xác ở đây là gì.
Người dùng

5

Bạn đã sắp xếp với những con số? Tôi thấy rằng không đệm vào cột mà tôi đã tham gia đã giải quyết vấn đề này cho tôi.

cat file.txt \
     | awk -F"   " '{ $20=sprintf("%06s", $20); print $0}' \
     | sort > readytojoin.txt

5

Nếu bạn chắc chắn rằng bạn đã sắp xếp đúng các tệp đầu vào của mình và các dòng của chúng có thể được ghép nối, bạn có thể tránh được lỗi trên bằng cách chạy join --nocheck-order file1.txt file2.txt


4

sort theo mặc định sử dụng toàn bộ dòng làm khóa

join chỉ sử dụng trường được chỉ định làm khóa.

Bạn phải sửa lỗi không tương thích này bằng cách hạn chế sắp xếp chỉ sử dụng khóa bạn muốn tham gia.

Trang Tham gia cho biết:

Quan trọng: FILE1 và FILE2 phải được sắp xếp trên các trường tham gia. Ví dụ: sử dụng 'sort -k 1b, 1' nếu> 'tham gia' không có tùy chọn. Lưu ý, so sánh tôn trọng các quy tắc được chỉ định bởi 'LC_COLLATE'. Nếu đầu vào> không được sắp xếp và một số dòng không thể được nối, một thông báo cảnh báo sẽ được đưa ra.


2
LOCALE=C sort ...
LOCALE=C join ...

Điều này sẽ giải quyết vấn đề của bạn. Vấn đề, như được chỉ ra bởi @Michael, là trình tự đối chiếu, tùy thuộc vào cài đặt LOCALE của bạn.


2

Lưu ý rằng nếu bạn thấy lỗi này và bạn đã sắp xếp trên một cột cụ thể và đang đập đầu vào tường, ví dụ: sort -k4,4 thì bạn cũng có thể cần phải đặt dấu phân cách cho lệnh sort

Rõ ràng OP đã làm điều này với -t '' nhưng đối với một tab bình thường, văn bản được phân tách tôi muốn giới thiệu

sort -t $'\t' ...

Lệnh sort có thể kết hợp các khoảng trắng dưới dạng dấu phân cách theo mặc định ngay cả trên một cái gì đó trông giống như một tệp được phân tách bằng tab (đặc biệt là nếu có khoảng trắng bên trong cột bạn đang sắp xếp).

Sau đó, nếu bạn đã vượt qua dữ liệu được sắp xếp đó để tham gia và bạn có

join -t $'\t' ...

Sau đó, điều này kết thúc gây ra thông báo lỗi về nó không được sắp xếp. Như đã lưu ý ở trên, tham gia có thể không chấp nhận -t '' mặc dù.


1

Để tham gia đối số sau -t là một ký tự. Để sắp xếp, bạn có thể cung cấp một dải phân cách dài hơn. Tôi nghĩ rằng bạn có thể tham gia các tệp trên một lĩnh vực khác mà bạn muốn và bỏ qua trường hợp này sẽ giải quyết vấn đề bằng sự trùng hợp.

Và tôi đồng ý với Gilles, dữ liệu mẫu đó sẽ hữu ích.

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.