Sortir dan gabungkan 2 file tanpa garis duplikat, berdasarkan kolom pertama

12

Saya memiliki file dengan semua nama tes:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

Dan file lain yang berisi nama tes dan hasil yang terkait:

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

Bagaimana cara membuat file baru yang berisi semua nama tes dengan hasil terkait tanpa duplikat?

Jika saya menjalankan:

sort all_tests.txt completed_tests.txt

Output berisi duplikat:

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

Output yang diinginkan:

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

Jawaban:

17

Sepertinya Anda dapat mencapai ini dengan joinsangat mudah jika kedua file diurutkan.

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

-a 1 berarti baris cetak dari file 1 yang tidak ada yang bergabung dengannya.

Jika file Anda belum diurutkan, Anda dapat menggunakan ini (terima kasih terdon!):

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

Alat yang tepat di sini adalah joinseperti yang disarankan oleh @Zanna, tapi inilah awkpendekatannya:

$ 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
terdon
sumber
2

Perl

Secara efektif, ini adalah port jawaban 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

Ini bekerja dengan membangun hash pasangan uji-status dari completed_test.txtdan kemudian mencari garis di all_tests.txtdalam hash itu. The $tvariabel total garis diolah dari setiap file dan $.yang ulang setelah mencapai akhir file, memungkinkan kita untuk melacak file yang saat ini dibaca.

Sergiy Kolodyazhnyy
sumber