Aqui está uma solução Awk.
awk '/dead/ { a[++n] = NR }
END { for (i=1; i<=n; i++) if (a[i] > NR/2) break
print ARGV, int(NR/2), i-1 >"log_1";
print ARGV, int(NR/2)+(int(NR/2)!=NR/2), n-i+1 >"log_2" }' file
Coletamos na matriz a
os números de linha das correspondências. Descobrimos, então, quantos dos números de linha na matriz são menores que a linha intermediária; sua contagem é atribuída à primeira partição. (Temos que usar i-1
porque já passamos do ponto de particionamento quando break
sai do loop.)
Em geral, você quer evitar reler o mesmo arquivo várias vezes, especialmente se for grande; e em segundo lugar, tente minimizar o número de processos.
Não está claro o que você espera que o campo de saída intermediária contenha. Se o arquivo contiver um número ímpar de linhas, a primeira "metade" conterá uma linha menor que a segunda. (Isso não é difícil de mudar, mas você tem que decidir de uma forma ou de outra.)