Mesclar arquivos de texto com primeira coluna e diferença no arquivo de saída

2

Arquivo 1: ( text1.txt )

Row_Added_Ts    Count   
01/01/14        2022448     
02/01/14        8345155   
03/01/14        8663852  
04/01/14        6785739  
05/01/14        5279913  

Arquivo 2: ( text2.txt )

Row_Added_Ts    Count  
01/01/14    211      
02/01/14    1598    
03/01/14    1710    
05/01/14    5279913  
06/01/14    7953261 

Arquivo de saída:

Row_Added_Ts    Count       Row_Added_Ts    Count   Difference  
01/01/14        2022448     01/01/14    211         2022237  
02/01/14        8345155     02/01/14    1598        8343557  
03/01/14        8663852     03/01/14    1710        8662142  
04/01/14        6785739     04/01/14    0           6785739  
05/01/14        5279913     05/01/14    5279913     0  
06/01/14        0           06/01/14    7953261     -7951831  

O requisito é combinar 2 arquivos e preencher as linhas com 0 quando não houver correspondência. Também faça a diferença de contagem no arquivo de saída final.

Eu tentei combinar com os comandos join e awk , mas não obtive a saída desejada.

join -j 2 -o 1.1 1.2 2.1 2.2 text1.txt text2.txt  

awk 'BEGIN {FS = OFS = "/t"}
NR == FNR {f[$1] = $0 next}
  {print f[$1]   $0}' text2.txt text1.txt

Além disso, join com sort não está funcionando em sh , ksh ou bash .

    
por Badrinarayana Vengavasi 02.09.2015 / 13:02

1 resposta

1

Use join e awk juntos:

join -t $'\t' -j 1 -a 1 -a 2 -e 0 -o 0,1.2,0,2.2 file1 file2 | \
  awk 'OFS="\t"{$5=$2-$4}NR==1{$5="Difference"}1'

Onde:

  • -t define o delimitador de entrada e saída
  • -j define o campo de junção em ambos os arquivos
  • -a força junção para imprimir linhas não pareadas de ambos os arquivos
  • -e especifica como preencher os campos vazios
  • e -o é o formato de saída
  • awk define primeiro o separador do campo de saída OFS para a guia
  • o quinto campo $5 é calculado a partir do 2º e 4º
  • e se for a primeira linha do arquivo, formate o quinto campo como cabeçalho
por 02.09.2015 / 13:20