2009-06-12 29 views
13

Tôi có hai tập tin mà tôi muốn thực hiện công đoàn hoạt động dựa trên cột 1:Padding Rỗng Dòng trong Unix Tham gia hoạt động

file1.txt

foo 1 
bar 2 
qux 3 

file2.txt

foo x 
qux y 
boo z 

Kết quả tôi hy vọng nhận được là như sau:

foo 1 x 
bar 2 - 
qux 3 y 
boo - z 

trong đó các trường trống của cột 1 được đệm bằng "-".

Nhưng tại sao lệnh nối này không hoạt động như tôi mong đợi?

$ join -a1 -a2 -e"-" file1.txt file2.txt 

Cách thích hợp để làm điều đó là gì?

Trả lời

21

"Quan trọng: FILE1 và FILE2 phải được sắp xếp trên các trường tham gia." (từ this manpage trực tuyến).

Vấn đề này # 1. Vấn đề # 2 là tồi tệ hơn: Tùy chọn -e là tài liệu xấu - chỉ làm việc cùng với -o, vì vậy ví dụ:

$ join -a 1 -a 2 -e'-' -o '0,1.2,2.2' sfile1.txt sfile2.txt 
bar 2 - 
boo - z 
foo 1 x 
qux 3 y 

nơi tên s tiền tố chỉ ra tập tin mà tôi đã sort ed trước.

Chỉnh sửa: man join giải thích công tắc -o (do đó trang manpage trực tuyến tôi chỉ đến ở trên). Nó chỉ định các trường cho đầu ra (1.2 có nghĩa là trường thứ 2 từ tệp 1, & c) hoặc 0 để có nghĩa là trường nối và là danh sách được phân cách bằng dấu phẩy. (Tôi không nhớ giá trị 0, thực ra, vì vậy ban đầu đã đưa ra một giải pháp vụng về đòi hỏi xử lý hậu xử lý, nhưng giải pháp hiện tại thì tốt hơn ... và không cần thiết!).

+0

@ Alex: cảm ơn rất nhiều. Tôi không hiểu tùy chọn "-o" 1.1.2.1,1.2,2.2 '". Tôi có thể tìm thông tin về điều đó ở đâu? Ngoài ra nếu bạn không nhớ awk xin vui lòng? – neversaint

+1

Tôi đã chỉnh sửa câu trả lời để giải thích -o, nhưng hãy nhìn vào 'người đàn ông': như tôi đã làm, để kiểm tra lời giải thích của tôi, tôi đã được nhắc nhở về giá trị 0 cho số trường, mà bây giờ tôi đã sử dụng đã chỉnh sửa ví dụ và làm cho quá trình xử lý không cần thiết. Nhưng hãy nhớ sắp xếp các tệp của bạn trước! -) –

+0

@ Alex, cảm ơn một triệu. – neversaint

2

-e chỉ làm việc với -o

join -a 1 -a 2 -e"-" -o auto file1.txt file2.txt 
Các vấn đề liên quan