Classifique e mescle 2 arquivos sem linhas duplicadas, com base na primeira coluna

12

Eu tenho um arquivo com o nome de todos os testes:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

E outro arquivo contendo os nomes dos testes e o resultado associado:

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

Como criar um novo arquivo contendo todos os nomes de teste com o resultado associado sem duplicatas?

Se eu executar:

sort all_tests.txt completed_tests.txt

A saída contém duplicatas:

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

A saída desejada:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed
    
por Benny 13.06.2017 / 12:52

3 respostas

17

Parece que você pode conseguir isso com join com muita facilidade se os arquivos forem classificados.

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

-a 1 significa imprimir linhas do arquivo 1 que não tinha nada associado a elas.

Se seus arquivos ainda não estão classificados, você pode usar isso (obrigado, obrigado!):

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )
    
por Zanna 13.06.2017 / 13:01
7

A ferramenta certa aqui é join como sugerido por @Zanna, mas aqui está uma abordagem awk :

$ awk 'NR==FNR{a[]=; next}{print ,a[]}' completed_tests.txt all_tests.txt 
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed
    
por terdon 13.06.2017 / 13:06
2

Perl

Efetivamente, esta é uma porta da resposta 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

Isso funciona criando um hash de pares de status de teste de completed_test.txt e, em seguida, procurando linhas em all_tests.txt nesse hash. A variável $t do total de linhas processadas de cada arquivo e $. que é redefinida ao atingir o final do arquivo, nos permite rastrear qual arquivo é lido no momento.

    
por Sergiy Kolodyazhnyy 26.06.2017 / 21:36