Compare a primeira coluna de 2 arquivos com base na segunda coluna usando o delimitador;

0

Eu preciso comparar abaixo de 2 arquivos.

O head_file :

    2345;int builder(
    1000;char type::edit::display <test>(
    250;void unamed_string_tree*

O ref_file :

    2000;int builder(
    500;char type::edit::display <test>(
    3000;fillTest*(

Saída desejada:

FUNCTION,HEAD,REF,DIFF
int builder(,2345,2000,-345
char type::edit::display <test>(,1000,500,-500
void unamed_string_tree*,250,0,-250
fillTest*(,0,3000,3000
    
por ekassis 25.09.2015 / 18:39

1 resposta

2

com awk :

awk -F";" 'BEGIN{OFS=",";
  print "FUNCTION,HEAD,REF,DIFF"}
  FNR==NR{a[$2]=$1;next}
  {print $2,$1,a[$2]*1,a[$2]-$1; delete a[$2]}
  END{for (i in a){print i,0,a[i],a[i]}}' ref_file head_file

A explicação :

  • -F";" especifica o ponto e vírgula ; como delimitador.
  • A regra BEGIN{...} é executada apenas uma vez, antes de o primeiro registro de entrada ser lido. Nessa regra, o OFS (separador do campo de saída) é definido como vírgula , e a linha do cabeçalho é impressa: FUNCTION,HEAD,REF,DIFF .
  • FNR==NR se aplica ao primeiro arquivo sendo processado: ref_file .
    • a[$2]=$1;next O conteúdo dos arquivos agora é armazenado em uma matriz chamada a com o índice $2 e o valor $1 .
  • {...} esse bloco se aplica a todas as linhas do segundo arquivo, o head_file :
    • print ... os valores são impressos com o valor correspondente na matriz criada anteriormente. Observe [$2]*1 ; quando o valor está vazio, a multiplicação com *1 termina em zero 0 .
    • delete a[$2] : quando terminar, exclua o elemento da matriz.
  • A regra END{...} é executada apenas uma vez, depois que o último registro de entrada é lido.
    • for (i in a) : Faz um loop pelo restante da matriz a , que ainda não foi excluída.
    • print ... : imprime seus índices e valores.

A saída :

FUNCTION,HEAD,REF,DIFF
int builder(,2345,2000,-345
char type::edit::display <test>(,1000,500,-500
void unamed_string_tree*,250,0,-250
fillTest*(,0,3000,3000
    
por 25.09.2015 / 19:21