Combine dois arquivos em um arquivo

0

Suponha que eu tenha 2 arquivos, ABC.txt & DEF.txt com os dados mostrados abaixo como exemplo:

ABC.txt:

abc 14
dka 1
def 51

DEF.txt:

def 12
ckd 41

Eu quero grep coluna 1 & 2 de ambos os arquivos e gravar em um terceiro arquivo para que o terceiro arquivo contenha o arquivo sem qualquer coluna repetida 1 e o valor thire colocado para dois arquivos e coloque zero para valores que não saíram nos arquivos. Como isso pode ser feito?

Minha saída esperada é (saída:

       ABC     DEF
abc    14      0
ckd    0       41
def    51      12
dka    1       0
    
por fvosta 15.12.2017 / 14:41

3 respostas

4

$ join -j 1 -a 1 -a 2 -o 0,1.2,2.2 -e 0 <(sort ABC.txt) <(sort DEF.txt)
abc 14 0
ckd 0 41
def 51 12
dka 1 0

O espaçamento do cabeçalho e da coluna é deixado como um exercício.

    
por 15.12.2017 / 15:25
3

Awk solução:

awk 'BEGIN{ 
         OFS="\t"; print "", "ABC", "DEF" 
     }
     NR==FNR{ a[$1]=$2; next }
     { 
         if ($1 in a) { v=a[$1]; delete a[$1] } 
         $3 = v+0 
     }1; 
     END{ for(i in a) print i, 0, a[i] }' DEF.txt ABC.txt

A saída:

    ABC DEF
abc 14  0
dka 1   0
def 51  12
ckd 0   41
    
por 15.12.2017 / 15:07
2

O datamash do GNU tem uma opção de tabulação cruzada (tabela dinâmica) que é muito boa para esse tipo de coisa - embora seus dados precisem de algum pré-processamento:

awk '{print $0, substr(FILENAME,1,length(FILENAME)-4)}' ABC.txt DEF.txt | 
  datamash -Ws --filler='0' crosstab 1,3 unique 2
        ABC     DEF
abc     14      0
ckd     0       41
def     51      12
dka     1       0
    
por 15.12.2017 / 16:16