Por que esse comando do awk não faz uma junção externa completa?

3

Objetivo: Mesclar o conteúdo de dois arquivos usando a chave comum presente nos arquivos

 file1.txt
 =========
 key1   11
 key2   12
 key3   13


 file2.txt
 =========
 key2   22
 key3   23
 key4   24
 key5   25


 Expected Output :
 ==================
 key1   11
 key2   12    22
 key3   13    23 
 key4   24
 key5   25

Abordagens tentadas:

  1. comando join :

    join -a 1 -a 2 file1.txt file2.txt ## full outer join
    
  2. awk :

    awk 'FNR==NR{a[$1]=$2;next;}{ print $0, a[$1]}' 2.txt 1.txt
    

A abordagem 2 está resultando em uma junção externa direita e NÃO em uma junção externa completa:

   key1  11
   key2  12    22
   key3  13    23 

O que precisa ser modificado na abordagem 2 para resultar em uma junção externa completa?

    
por Murali Rao 08.04.2015 / 05:31

4 respostas

0

Com awk , tente:

awk '{a[$1]=($1 in a)?a[$1]" "$2:$2};END{for(i in a)print i,a[i]}' file1 file2

Para arquivos grandes, você deve usar a abordagem join em vez de awk , desde quando a abordagem awk armazenará todo o conteúdo dos arquivos na memória antes de imprimir.

    
por 08.04.2015 / 05:47
4

Minha solução usando join :

join -a1 -a2  -1 1 -2 1 -o 0,1.2,2.2 -e "NULL" file1 file2 

Eu não sei muito sobre awk para ingressar em arquivos grandes e sempre uso join .

key1 11 NULL
key2 12 22
key3 13 23
key4 NULL 24
key5 NULL 25
    
por 08.04.2015 / 07:14
1

Minha solução com awk:

awk '{a[$1]=a[$1]" "$2} END{for(i in a)print i, a[i]}' file1.txt file2.txt

Com keyn como índice, anexe o second fields de cada linha ao a[keyn] correspondente (com space ). No final, imprima todos os indices e array element .

Saída:

AMD$ awk '{a[$1]=a[$1]" "$2} END{for(i in a)print i, a[i]}' file1.txt file2.txt
key1  11
key2  12 22
key3  13 23
key4  24
key5  25
    
por 08.04.2015 / 07:19
0

Seu primeiro join parece estar bem aqui, embora esteja escrito incorretamente em maiúsculas:

$>join -a 1 -a 2 file1.txt file2.txt 
key1 11
key2 12 22
key3 13 23
key4 24
key5 25
    
por 08.04.2015 / 08:11