it-swarm.com.de

Sortieren und verschmelzen Sie 2 Dateien ohne doppelte Zeilen, basierend auf der ersten Spalte

Ich habe eine Datei mit allen Testnamen:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

Und noch eine Datei mit den Testnamen und dem dazugehörigen Ergebnis:

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

Wie erstelle ich eine neue Datei mit allen Testnamen und dem dazugehörigen Ergebnis ohne Duplikate?

Wenn ich ausführe:

sort all_tests.txt completed_tests.txt

Die Ausgabe enthält Duplikate:

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

Die gewünschte Ausgabe:

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

Scheint, dass Sie dies mit join sehr einfach erreichen können, wenn beide Dateien sortiert sind.

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

-a 1 steht für Druckzeilen aus Datei 1, mit denen nichts verbunden war.

Wenn Ihre Dateien noch nicht sortiert sind, können Sie dies verwenden (danke terdon!):

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

Das richtige Werkzeug ist join als vorgeschlagen von @Zanna, aber hier ist ein awk Ansatz:

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

Perl

Tatsächlich ist dies eine Antwort von 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

Dies funktioniert, indem ein Hash von Test-Status-Paaren aus completed_test.txt erstellt und dann in diesem Hash Zeilen in all_tests.txt nachgeschlagen werden. Mit der Variablen $t der Gesamtanzahl der Zeilen, die aus jeder Datei verarbeitet werden, und $., die beim Erreichen des Dateiendes zurückgesetzt werden, können wir verfolgen, welche Datei gerade gelesen wird.

2