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

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 )

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.