2012-11-14 28 views
16

Tôi cần tham gia hai tệp trên hai trường. Tuy nhiên tôi nên lấy tất cả các giá trị trong tập tin 1 ngay cả khi tham gia thất bại của nó giống như một tham gia bên ngoài bên trái.Tham gia bên ngoài trái trên hai tệp trong unix

Tập 1:

01|a|jack|d 
02|b|ron|c 
03|d|tom|e 

Tập 2:

01|a|nemesis|f 
02|b|brave|d 
04|d|gorr|h 

đầu ra:

01|a|jack|d|nemesis|f 
02|b|ron|c|brave|d 
03|d|tom|e|| 

Trả lời

19

Đó là join -t '|' file1 file2 -a1

Tùy chọn sử dụng:

t: Dấu phân cách.
a: Quyết định số tệp mà từ đó các dòng chưa được ghép phải được in.

join -t '|' file1 file2 -a2 sẽ thực hiện ngay bên ngoài tham gia.

Run Sample

[[email protected] test]$ cat f1 
    01|a|jack|d 

    02|b|ron|c 

    03|d|tom|e 
    [[email protected] test]$ cat f2 
    01|a|nemesis|f 

    02|b|brave|d 

    04|d|gorr|h 
    [[email protected] test]$ join -t '|' f1 f2 -a1 
    01|a|jack|d|a|nemesis|f 

    02|b|ron|c|b|brave|d 

    03|d|tom|e 
+1

bạn nói đúng, đầu ra của bạn phù hợp với sản lượng của mình. trường hợp đóng cửa. Chúc mọi người may mắn. – shellter

+0

@shellter. Không hẳn. Có một đường ống bị thiếu ở cuối bản ghi mà không có một kết quả phù hợp trong bài viết của idm. Tuy nhiên, tôi đưa ra điều này là một chiến lược để có được hầu hết mọi người trên bướu tìm kiếm chức năng kết nối bên ngoài Linux. –

4

Để thực hiện chính xác những gì các câu hỏi yêu cầu là một chút phức tạp hơn câu trả lời trước và sẽ đòi hỏi một cái gì đó như thế này:

sed 's/|/:/2' file1 | sort -t: >file1.tmp 
sed 's/|/:/2' file2 | sort -t: >file2.tmp 
join -t':' file1.tmp file2.tmp -a1 -e'|' -o'0,1.2,2.2' | tr ':' '|' 

Unix tham gia chỉ có thể tham gia vào một trường AFAIK duy nhất để bạn phải sử dụng các tệp sử dụng dấu phân cách khác để "kết hợp hai tệp trên hai trường", trong trường hợp này là hai trường đầu tiên. Tôi sẽ sử dụng dấu hai chấm :, tuy nhiên nếu : tồn tại trong bất kỳ đầu vào nào, bạn sẽ cần phải sử dụng cái gì khác, ví dụ tab có thể là lựa chọn tốt hơn để sử dụng sản xuất. Tôi cũng sắp xếp lại đầu ra trên trường hợp chất mới, sort -t:, cho các tệp đầu vào ví dụ không tạo ra sự khác biệt nào nhưng sẽ cho dữ liệu thế giới thực. sed 's/|/:/2' thay thế sự xuất hiện thứ hai của đường ống với dấu hai chấm trên mỗi dòng trong tệp.

file1.tmp

01|a:jack|d 
02|b:ron|c 
03|d:tom|e 

file2.tmp

01|a:nemesis|f 
02|b:brave|d 
04|d:gorr|h 

Bây giờ chúng ta sử dụng join đầu ra được lọc bởi tr với hơn một vài tùy chọn nâng cao:

  • -t':' chỉ định đại tràng tạm thời delimiter
  • -a1 bên ngoài bên trái tham gia
  • -e'|' chỉ định chuỗi thay thế cho tham gia không thành công, về cơ bản là dấu phân cách đầu ra cuối cùng N-1 lần trong đó N là số trường phân cách đường ống được nối vào bên phải dấu hai chấm trong tệp2.tmp. Trong trường hợp này N = 2 nên một ký tự ống.
  • -o'0,1.2,2.2' quy định các định dạng đầu ra:
    • 0 tham gia lĩnh vực
    • 1.2 trường 2 của file1.tmp, tức là tất cả mọi thứ bên phải của ruột
    • 2.2 trường 2 của file2.tmp
  • tr ':' '|' Cuối cùng chúng tôi dịch các dấu hai chấm trở lại đường ống cho đầu ra cuối cùng.

Sản lượng hiện nay phù hợp với sản lượng mẫu câu hỏi chính xác câu trả lời trước đó đã không làm:

01|a|jack|d|nemesis|f 
02|b|ron|c|brave|d 
03|d|tom|e|| 
+0

Cũng nghĩ ra phản ứng, và giải thích tuyệt vời của từng chi tiết. –

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