J'ai un fichier avec le nom de tous les 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
On dirait que vous pouvez y parvenir avec join
très facilement si les fichiers sont tous 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 que les lignes du fichier 1 ne sont pas jointes.
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 )
Le bon outil ici est join
as suggéré par @Zanna, mais voici une approche awk
:
$ 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
Effectivement, voici une réponse du port 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 construisant un hachage de paires test-status à partir de completed_test.txt
, puis en recherchant des lignes dans all_tests.txt
dans ce hachage. La variable $t
du nombre total de lignes traitées à partir de chaque fichier et $.
qui est réinitialisée une fois la fin du fichier atteinte, nous permet de garder trace du fichier actuellement lu.