Sắp xếp và hợp nhất 2 tệp không có dòng trùng lặp, dựa trên cột đầu tiên


12

Tôi có một tập tin với tất cả các tên kiểm tra:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

Và một tệp khác chứa tên thử nghiệm và kết quả liên quan:

$ cat completed_tests.txt
test1 Passed
test3 Failed
test5 Passed
test6 Passed

Làm cách nào để tạo một tệp mới chứa tất cả các tên kiểm tra với kết quả được liên kết mà không trùng lặp?

Nếu tôi thực thi:

sort all_tests.txt completed_tests.txt

Đầu ra chứa các bản sao:

test1 
test1 Passed
test2
test3 
test3 Failed
test4
test5 
test5 Passed
test6 
test6 Passed

Đầu ra mong muốn:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

Câu trả lời:


17

Có vẻ như bạn có thể đạt được điều này joinrất dễ dàng nếu cả hai tệp được sắp xếp.

$ join -a 1 all_test.txt completed_test.txt
test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

-a 1 có nghĩa là các dòng in từ tệp 1 không có gì được nối với chúng.

Nếu các tệp của bạn chưa được sắp xếp, bạn có thể sử dụng tệp này (cảm ơn terdon!):

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )

7

Các công cụ thích hợp ở đây là joinnhư gợi ý bởi @Zanna, nhưng đây là một awkcách tiếp cận:

$ awk 'NR==FNR{a[$1]=$2; next}{print $1,a[$1]}' completed_tests.txt all_tests.txt 
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

2

Perl

Thực tế, đây là một câu trả lời của terdon:

$ perl -lane '$t+=1; $h{$F[0]}=$F[1] if $.==$t; print $F[0]," ",$h{$F[0]} if $t!=$.;$.=0 if eof' completed_tests.txt all_tests.txt          
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

Điều này hoạt động bằng cách xây dựng hàm băm của các cặp trạng thái thử nghiệm completed_test.txtvà sau đó tìm kiếm các dòng trong all_tests.txthàm băm đó. Các $tbiến số dòng chế biến từ mỗi tập tin và $.đó là thiết lập lại khi đến cuối tập tin, cho phép chúng ta theo dõi các tập tin mà hiện đang đọc.

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.