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==NR
se aplica ao primeiro arquivo sendo processado:ref_file
.-
a[$2]=$1;next
O conteúdo dos arquivos agora é armazenado em uma matriz chamadaa
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 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