A resposta abaixo faz várias alterações na sua técnica.
-
Faça tudo em um único programa
awk
em 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==3
porque todas linhas após a linha 6 atendem a esse critério. -
Eliminar a variável
test
e, em vez disso, vamos manter uma guia em execução da diferença mínima entrefermi_energy
e$1
. Para isso, vamos criar uma variávelmin
que 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
awk
suporta notação científica de ponto flutuante. Por exemplo, em um comandoprintf
, pode-se usar o formato%E
. Como de costume, consulte a páginaman
ou 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 }'