Junte-se, preenchendo os valores-chave ausentes

4

Eu tenho dois arquivos com um valor de chave primária como um primeiro campo e um valor correspondente como os campos restantes, e alguns valores de chave primária estão faltando em um deles, mas estão presentes em outro, e vice-versa:

$ cat jointest1.txt jointest2.txt  
a 1  
b 2  
d 4  
e 5    

a 10  
b 11  
c 12  
d 13  

Eu esperaria uma saída que mesclasse esses arquivos de acordo com uma chave primária, substituindo os valores ausentes ou não, como:

$ joinmerge  jointest1.txt jointest2.txt   
a 1 10  
b 2 11  
c - 12  
d 4 13  
e 5 -

Capacidade de substituir valores perdidos por traços ou algo é opcional.

Eu tentei join , mas ele diz que meus arquivos não estão classificados corretamente:

$ join jointest1.txt jointest2.txt   
a 1 10  
b 2 11  
join: file 2 is not in sorted order  
d 4 13  

Qual comando devo usar em vez disso?

    
por mbaitoff 21.03.2012 / 09:47

3 respostas

4

Qual implementação de join você está usando? Com join (GNU coreutils) 5.97 , posso usar

[0 1021] ~/temp/jointest % join -a1 -a2 jointest1.txt jointest2.txt
a 1 10
b 2 11
c 12
d 4 13
e 5 

e a junção "simples" também funciona (mas omite c e e). Existe uma opção -e que supostamente permite escolher o marcador para campos vazios, mas parece estar quebrado na minha versão e preenche apenas o caso e, não o caso c.

    
por 21.03.2012 / 10:08
6

Tente o seguinte:

> join -e- -a1 -a2 jointest1 -o 0 1.1 1.2 2.1 2.2 jointest2
a a 1 a 10
b b 2 b 11
c - - c 12
d d 4 d 13
e e 5 - -

ou

> join -e- -a1 -a2 jointest1 -o 0 1.2 2.2 jointest2
a 1 10
b 2 11
c - 12
d 4 13
e 5 -

Não tenho certeza se / como é possível conseguir o mesmo sem a opção -o. A opção -o diz: primeiro imprima o campo de junção e, em seguida, o campo no. 2 do arquivo 1, em seguida, campo 2 do arquivo 2. Tipo de triste você tem que saber o formato dos arquivos para obter os campos vazios para o trabalho.

    
por 22.04.2012 / 14:03
1

Eu escrevi uma ferramenta perl exatamente para essa chave, problema de valor:

Emparelhando as linhas certas: qualquer número de arquivos . Também está disponível através do GitHub .

Para executá-lo, você digita:

merge -k -e "-" jointest1.txt jointest2.txt
    
por 01.04.2014 / 07:55