O arquivo 'x':
FNR==1 {
++FILENO
}
{
T[$1]++
X[$1,FILENO]=$2
}
END {
print "type\tvalue1\tvalue2\tdifference"
for(t in T)
print t"\t"X[t,1]+0"\t"X[t,2]+0"\t"0+X[t,1]-X[t,2]
}
A corrida:
$ awk -f x file1 file2
type value1 value2 difference
viewer 23 2990 -2967
remark 2 240 -238
test 27 0 27
exam 0 200 -200
Versão com linha para "total", ordenando e pulando linhas sem diferença:
FNR==1 {
++FILENO
}
{
T[$1]++
X[$1,FILENO]=$2
}
END {
print "type\tvalue1\tvalue2\tdifference"
for(t in T) {
if(X[t,1]!=X[t,2])
print t"\t"X[t,1]+0"\t"X[t,2]+0"\t"0+X[t,1]-X[t,2] | "sort"
S[1]+=X[t,1]
S[2]+=X[t,2]
}
close("sort")
print "total\t"S[1]+0"\t"S[2]+0"\t"S[1]-S[2]+0
}
Eu adicionei uma linha "bocejos 3" para os dois arquivos de entrada ...
arquivo1:
yawns 3
viewer 23
test 27
remark 2
arquivo2:
viewer 2990
yawns 3
exam 200
remark 240
Em exibição:
$ awk -f x file1 file2
type value1 value2 difference
exam 0 200 -200
remark 2 240 -238
test 27 0 27
viewer 23 2990 -2967
total 55 3433 -3378
... e "yawns" não aparecem na saída.
O GAWK pode classificar sem sort
externo, mas, pelo maior tempo possível, prefiro não desassociar os recursos do GAWKy.