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, oOFS(separador do campo de saída) é definido como vírgula,e a linha do cabeçalho é impressa:FUNCTION,HEAD,REF,DIFF. -
FNR==NRse aplica ao primeiro arquivo sendo processado:ref_file.-
a[$2]=$1;nextO conteúdo dos arquivos agora é armazenado em uma matriz chamadaacom o índice$2e 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*1termina em zero0. -
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 matriza, 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