Trier et fusionner 2 fichiers sans lignes en double, en fonction de la première colonne

12

J'ai un fichier avec tous les noms des tests:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

Et un autre fichier contenant les noms des tests et le résultat associé:

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

Comment créer un nouveau fichier contenant tous les noms de test avec le résultat associé sans doublons?

Si j'exécute:

sort all_tests.txt completed_tests.txt

La sortie contient des doublons:

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

La sortie souhaitée:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed
Benny
la source

Réponses:

17

Il semble que vous puissiez y parvenir jointrès facilement si les fichiers sont tous les deux triés.

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

-a 1 signifie imprimer des lignes du fichier 1 qui n'avaient rien de joint.

Si vos fichiers ne sont pas déjà triés, vous pouvez utiliser ceci (merci terdon!):

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )
Zanna
la source
7

Le bon outil ici est joincomme suggéré par @Zanna, mais voici une awkapproche:

$ 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
la source
2

Perl

Effectivement, ceci est une réponse de 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

Cela fonctionne en créant un hachage de paires d'état de test à partir de completed_test.txt, puis en recherchant des lignes all_tests.txtdans ce hachage. La $tvariable du nombre total de lignes traitées à partir de chaque fichier et $.qui est réinitialisée à la fin du fichier, nous permet de garder une trace du fichier actuellement lu.

Sergiy Kolodyazhnyy
la source