Apenas um comando awk
desta forma:
awk -v reflog=OUT.LOG '
BEGIN{
FS=OFS=",";
while((getline <reflog) > 0) refs[$3]=$1;
close(reflog)
}{
print $3,$1,refs[$3] ? refs[$3] : "not found"
}' IN.LOG
Ou usando join
, que é feito exatamente para casos de uso como este:
join -t, -j 3 -o 0,1.1,2.1 -a 1 -e "not found" \
<(sort -t, -k3 IN.LOG) <(sort -t, -k3 OUT.LOG) \
| sort -t, -k2
Note que join
precisa de arquivos de entrada classificados (por "join column"). É por isso que classificamos os dois arquivos de log por coluna de referência e depois classificamos a saída novamente por data.
Ambas as ações se comportam de maneira diferente em relação a referências não exclusivas em OUT.LOG. awk
ignoraria refs duplicados em OUT.LOG (o último ganha), mas join
imprimia todas as correspondências. Além disso, se você adicionar -a 2
ao comando join
, ele imprimirá todas linhas não paráveis.