2012-03-05 29 views
9

Tôi muốn hợp nhất hai tệp theo một cột trong unix.Hợp nhất hai tệp theo một cột trong unix

Tôi có file_a:

subjectid name age 
12 Jane 16 
24 Kristen 90 
15 Clarke 78 
23 Joann 31 

Tôi có một file_b:

subjectid prob_disease 
12 0.009 
24 0.738 
15 0.392 
23 1.2E-5 

Tôi muốn hợp nhất các tập tin trong dòng lệnh. Tôi muốn hợp nhất các tệp a và b theo chủ đề. Vì mỗi tệp dài khoảng 2 triệu dòng, tôi đã thử trong R nhưng nó bị đóng băng do lượng dữ liệu, ai đó có thể giúp tôi làm điều này trong linux không? Đầu ra mong muốn:

subjectid prob_disease name age 
12 0.009 Jane 16 
24 0.738 Kristen 90 
15 0.392 Clarke 78 
23 1.2E-5 Joanna 31  

Xin hãy giúp đỡ và cảm ơn!

Trả lời

9

Khám phá join(1). Trong trường hợp của bạn, bạn thậm chí không cần bất kỳ cờ:

$ join file_b file_a 
subjectid prob_disease name age 
12 0.009 Jane 16 
24 0.738 Kristen 90 
15 0.392 Clarke 78 
23 1.2E-5 Joann 31 
+2

này hoạt động tuyệt vời chừng nào các dòng đã được xếp hàng bởi ID, nếu không chúng sẽ cần phải được sắp xếp. – Kevin

+0

... trong trường hợp này bạn cũng nên kiểm tra ['sort (1)'] (http://linux.die.net/man/1/sort). –

+0

Tôi sẽ đề xuất một bản hack vụng về với hai tệp, nhưng tham gia (1) rõ ràng là câu trả lời đúng ở đây. Tuy nhiên, không cần phải phân loại trước với awk. –

2

Bạn đang tìm kiếm lệnh join:

$ cat test.1 
12 Jane 16 
24 Kristen 90 
15 Clarke 78 
23 Joann 31 
$ cat test.2 
12 0.009 
24 0.738 
15 0.392 
23 1.2E-5 
$ join -j1 -o 2.1,2.2,1.2,1.3 <(sort test.1) <(sort test.2) 
12 0.009 Jane 16 
15 0.392 Clarke 78 
23 1.2E-5 Joann 31 
24 0.738 Kristen 90 
$ 
Các vấn đề liên quan