Seu afunilamento está lendo o arquivo recon.txt
linha por linha no shell. Para obter as linhas com falha, você poderia pré-processar as linhas nos logs para ficarem parecidas com as linhas em recon.txt
e, em seguida, usar comm(1)
para encontrar a diferença definida, talvez assim:
comm -23 \
<(sort -u recon.txt) \
<(sed 's/.*| id=\([0-9]*\)| version=\([0-9]*\)|.*/,/' worker-6715.log.2016-$1.log.* | \
sort -u)
Isso pressupõe um shell que pode manipular <(...)
construções. Além disso, observe que as linhas no resultado não preservam a ordem das linhas em recon.txt
. Manter esse pedido seria muito mais difícil (e mais lento).
Se você também precisar das contagens de sucesso, faça o inverso, pré-processe recon.txt
para que fique parecido com o que pode ser encontrado nos registros e use fgrep(1)
ou grep -F
para fazer a pesquisa. A definição de localidades para C
também pode acelerar bastante as coisas em alguns sistemas. Assim:
COUNT=$( \
sed 's/\([0-9]*\),\([0-9]*\)/| id=| version=|/' recon.txt | \
LC_ALL=C fgrep -f - worker-6715.log.2016-$1.log.* | \
wc -l )
Isso pressupõe que recon.txt
não contenha duplicatas e que cada linha em recon.txt
corresponda no máximo uma vez a todos os logs. Levantar a primeira restrição seria difícil. O segundo poderia ser levantado com um comm(1)
cuidadosamente escolhido.