A resposta abaixo faz várias alterações na sua técnica.
-
Faça tudo em um único programa
awkem vez de dois. Você pode fazer isso porque sua segunda execução lida apenas com linhas após a linha 6: -
Atribua corretamente o valor de fermi_energy da linha 6.
-
Não é mais necessário verificar se há
NF==3porque todas linhas após a linha 6 atendem a esse critério. -
Eliminar a variável
teste, em vez disso, vamos manter uma guia em execução da diferença mínima entrefermi_energye$1. Para isso, vamos criar uma variávelminque inicialmente terá um valor ridiculamente grande, garantido para falhar no primeiro teste. Também atribuiremos nomes compreensíveis às outras variáveis e imprimiremos apenas um resultado, após testar todas as linhas do arquivo. -
Substitua seu teste de valor absoluto pesado computacionalmente por um teste de zero de luz computacionalmente.
-
Observe que
awksuporta notação científica de ponto flutuante. Por exemplo, em um comandoprintf, pode-se usar o formato%E. Como de costume, consulte a páginamanou seu mecanismo de pesquisa favorito para saber mais. -
Tudo isso feito sem nenhuma compreensão da física de partículas, então eu posso ter algo errado. Perdão. Se assim for, espero que pelo menos isso te coloque no caminho certo.
awk ' BEGIN { min=1000 ; jump_energy="INIT" } function abs(v) {return v < 0 ? -v : v} NR==6 {fermi_energy=$4} NR>6 { if (jump_energy != 0) { this_diff=abs(fermi_energy-$1) if (this_diff < min) { min=this_diff energy_level=0 jump_energy=0 getline } } if (jump_energy == 0 && $2 != "0.0000E+00") { energy_level=$1 jump_energy=$2 } } END { printf " Fermi Energy: %f\n Energy Level: %f\n Jump Energy: %E\n", fermi_energy, energy_level, jump_energy }'