Ordene y combine 2 archivos sin líneas duplicadas, según la primera columna

12

Tengo un archivo con el nombre de todas las pruebas:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

Y otro archivo que contiene los nombres de las pruebas y el resultado asociado:

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

¿Cómo crear un nuevo archivo que contenga todos los nombres de prueba con el resultado asociado sin duplicados?

Si ejecuto:

sort all_tests.txt completed_tests.txt

La salida contiene duplicados:

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

La salida deseada:

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

Respuestas:

17

Parece que puede lograr esto joinmuy fácilmente si los archivos están ordenados.

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

-a 1 significa imprimir líneas del archivo 1 que no tenían nada unido a ellas.

Si sus archivos aún no están ordenados, puede usar esto (¡gracias terdon!):

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

La herramienta está aquí joincomo sugirió por @Zanna, pero aquí hay un awkenfoque:

$ 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
fuente
2

Perl

Efectivamente, este es un puerto de la respuesta 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

Esto funciona construyendo hash de pares de estado de prueba completed_test.txty luego buscando líneas all_tests.txten ese hash. La $tvariable del total de líneas procesadas de cada archivo y $.que se restablece al llegar al final del archivo, nos permite realizar un seguimiento de qué archivo se lee actualmente.

Sergiy Kolodyazhnyy
fuente