2011-06-18 40 views
6

Điều này không hoạt động như tôi mong đợi, mặc dù tất cả các nghiên cứu. Tôi phải mất một cái gì đó ...Sử dụng lệnh Unix JOIN để hợp nhất hai tệp

Tập 1 ...

# cat file1.csv 
1  123  JohnDoe 
1  456  BobDylan 
1  789  BillyJean 

Tập 2 ...

# cat file2.csv 
111  123  DaddyDoe 
222  456  DaddyDylan 
666  777  Stranger 
555  789  DaddyJean 
444  888  Stranger 
333  999  Stranger 

Tôi đang cố gắng tham gia vào cả lĩnh vực thứ hai. Khi tôi thực hiện một tham gia bên ngoài bên trái và chỉ bao gồm các lĩnh vực từ tập tin đầu tiên, mọi thứ dường như dandy.

# join -1 2 -2 2 -a 1 -o 1.2 1.3 file1.csv file2.csv 
123 JohnDoe 
456 BobDylan 
789 BillyJean 

Nhưng ngay khi tôi đưa trường vào từ tệp thứ hai, tất cả đều bị mất.

# join -1 2 -2 2 -a 1 -o 1.2 1.3 2.3 file1.csv file2.csv 
DaddyDoeoe 
DaddyDylann 
789 BillyJean DaddyJean 

Dòng cuối cùng trông hoàn hảo! Có chuyện gì với những người khác? Bất kỳ ý tưởng? Cảm ơn trước!

EDIT: Đây là nỗ lực của tôi với CSV thực tế.

# cat file1.csv 
1,123,JohnDoe 
1,456,BobDylan 
1,789,BillyJean 

# cat file2.csv 
111,123,DaddyDoe 
222,456,DaddyDylan 
666,777,Stranger 
555,789,DaddyJean 
444,888,Stranger 
333,999,Stranger 

# join -t, -1 2 -2 2 -a 1 -o 1.2 1.3 2.3 file1.csv file2.csv 
,DaddyDoeoe 
,DaddyDylann 
789,BillyJean,DaddyJean 
+0

gì phiên bản hệ điều hành bạn đang sử dụng? Và các cột có thực sự được phân tách bằng ',', theo đuôi tệp không? – shellter

+0

-o tùy chọn cần phải được báo giá, hoặc bạn có thể sử dụng dấu phẩy phân cách thay vì nếu không gian trắng. Bạn không chắc chắn nếu đó là vấn đề, nhưng có vẻ là một vấn đề một phần, – Suroot

+0

@shellter Unix 3.5. Chúng là các tệp phân tách tab. Tôi lấy ra dấu phẩy khi cố khắc phục sự cố. @Suroot Tôi đã cho rằng một shot nhưng nó dường như không thay đổi bất cứ điều gì. – Nate

Trả lời

5

Bạn đã sử dụng tùy chọn -a.

-a file_number

Ngoài đầu ra mặc định, tạo ra một dòng cho mỗi dòng không có cặp trong tập tin file_number.

Ngoài ra, hành vi ghi đè lẻ cho biết rằng bạn đã trả về vận chuyển được nhúng (\r). Tôi sẽ kiểm tra chặt chẽ các fies đó với cat -v hoặc trình soạn thảo văn bản không cố gắng "thông minh" về các tệp Windows.

+0

Hi @ geekosaur, vâng, đây là những gì tôi dự định. – Nate

+0

@Nate: Vậy tại sao bạn bối rối? Bạn đang nhận được những gì bạn yêu cầu; như với một tham gia ngoài SQL, các trường từ tệp khác là NULL (trống). – geekosaur

+0

có ba kết quả trùng khớp giữa các tệp: 123, 456, 789. Không có dữ liệu bị thiếu.Không chỉ vậy, nhưng hai dòng đầu tiên đầu tiên có tên từ hai tập tin được trộn với nhau. – Nate

2

Sử dụng dấu phân cách 'trường' chính xác trong lệnh của bạn.

Khi tôi thay đổi dữ liệu của bạn để csv đúng, và sử dụng

join -t, -1 2 -2 2 -a 1 -o 1.2 1.3 2.3 file1.csv file2.csv 
# ---^^^ 

tôi đã

123,JohnDoe,DaddyDoe 
456,BobDylan,DaddyDylan 
789,BillyJean,DaddyJean 

Tôi hy vọng điều này sẽ giúp.

+0

Cảm ơn @shellter. Tôi đã làm điều này nhưng có kết quả rất giống nhau. Tôi đã thêm mã vào câu hỏi của mình. – Nate

-1

Nếu bạn đang thực hiện dòng lệnh này tại sao không sử dụng dán? dán -d, file1 file2 file3 >>

các arugment -d là delimiter

+0

Có lẽ vì 'paste' thực hiện điều gì đó hoàn toàn khác ... – geirha

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