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

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 )

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.