Sortuj i scal 2 pliki bez zduplikowanych linii na podstawie pierwszej kolumny

12

Mam plik ze wszystkimi nazwami testów:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

I inny plik zawierający nazwy testu i powiązany wynik:

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

Jak utworzyć nowy plik zawierający wszystkie nazwy testów z powiązanym wynikiem bez duplikatów?

Jeśli wykonam:

sort all_tests.txt completed_tests.txt

Dane wyjściowe zawierają duplikaty:

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

Pożądana moc wyjściowa:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed
Benny
źródło

Odpowiedzi:

17

Wydaje się, że można to joinbardzo łatwo osiągnąć, jeśli oba pliki są posortowane.

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

-a 1 oznacza drukowanie wierszy z pliku 1, do których nic nie zostało dołączone.

Jeśli twoje pliki nie są jeszcze posortowane, możesz użyć tego (dzięki terdon!):

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )
Zanna
źródło
7

Odpowiednie narzędzie jest tutaj, joinjak sugeruje @Zanna, ale oto awkpodejście:

$ 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
źródło
2

Perl

W rzeczywistości jest to port odpowiedzi Terdona:

$ 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

Działa to poprzez budowanie skrótu par status-test z, completed_test.txta następnie wyszukiwanie linii all_tests.txtw tym skrócie. $tZmienna wszystkich linii przetworów każdego pliku i $.że jest resetowany po osiągnięciu końca pliku, pozwala nam śledzić, który plik jest aktualnie czytać.

Sergiy Kolodyazhnyy
źródło