İlk sütuna göre 2 dosyayı çift satır olmadan sıralayın ve birleştirin


12

Tüm testler adıyla bir dosya var:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

Test adlarını ve ilişkili sonucu içeren başka bir dosya:

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

Yinelenmeden ilişkili sonuçla birlikte tüm test adlarını içeren yeni bir dosya nasıl oluşturulur?

Eğer yürütürsem:

sort all_tests.txt completed_tests.txt

Çıktıda kopyalar var:

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

İstenen çıktı:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

Yanıtlar:


17

joinHer ikisi de dosyalar sıralanırsa bunu çok kolay bir şekilde başarabilirsiniz gibi görünüyor .

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

-a 1 dosya 1'den hiçbir şey eklenmemiş baskı satırları anlamına gelir.

Dosyalarınız zaten sıralanmamışsa, bunu kullanabilirsiniz (teşekkürler terdon!):

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

7

Burada doğru aracıdır joinolarak önerilen @Zanna tarafından, ama burada bir var awkbir yaklaşım:

$ 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

Etkili bir şekilde, bu bir terdon cevabı limanıdır:

$ 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

Bu, test durumu çiftlerinin karmasını oluşturarak completed_test.txtve ardından all_tests.txtbu karedeki satırlara bakarak çalışır . $tHer dosyadan işlenen toplam hatların değişken ve $.dosyanın sonuna ulaştıktan sonra yani sıfırlama, bize şu anda okunan hangi dosya izlemek için izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.