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


12

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

Antworten:


17

Scheint, dass Sie dies joinsehr einfach erreichen können, wenn die Dateien beide sortiert sind.

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

-a 1 bedeutet 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 )

7

Das richtige Werkzeug ist hier joinwie vorgeschlagen von @Zanna, aber hier ist ein awkAnsatz:

$ 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

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 aus Test-Status-Paaren erstellt completed_test.txtund dann die Zeilen all_tests.txtin diesem Hash nachgeschlagen werden. Die $tVariable der Gesamtzahl der Zeilen, die von jeder Datei verarbeitet werden und $.die beim Erreichen des Dateiendes zurückgesetzt wird, ermöglicht es uns, zu verfolgen, welche Datei gerade gelesen wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.