Assuming your data file looks like this
006 150
010 155
...
You can use a simple loop to read the source and destination numbers
while read ncase ndata
do
cp -a case_directory/$ncase/MRS data_directory/$ndata/
done < casedatafile
La respuesta a continuación hace una serie de cambios en su técnica.
Hágalo todo en un solo programa awk
en lugar de dos. Puede hacerlo porque su segunda ejecución solo se ocupa de las líneas después de la línea 6:
Asigne correctamente su valor de energía fermi _de la línea 6.
Ya no es necesario verificar NF==3
porque todas las líneas después de la línea 6 cumplen con ese criterio.
Elimine la variable test
y, en su lugar, mantengamos una pestaña activa de la diferencia mínima entre fermi_energy
y $1
. Para eso, crearemos una variable min
que inicialmente tendrá un valor ridículamente grande, garantizado para fallar la primera prueba. También asignaremos nombres comprensibles a las otras variables e imprimiremos solo un resultado, después de probar todas las líneas del archivo.
Reemplace su prueba de valor absoluto computacionalmente pesada con una prueba de cero computacionalmente ligera.
Tenga en cuenta que awk
admite la notación científica de coma flotante. Por ejemplo, en un comando printf
, se puede usar el formato %E
. Como de costumbre, consulte la página man
o su motor de búsqueda favorito para obtener más información.
Todo esto hecho sin conocimientos de física de partículas, por lo que es posible que tenga algo incorrecto. Perdón. Si es así, espero que al menos esto te ponga en el camino correcto.
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
}'
awk 'NR == 6 { fe = $4 }
NR > 6 && $1 > fe && $2 > 0 { print fe, $1; exit }' file
Para los datos de entrada dados en file
esto producirá
1.95329810 4.152
El script awk
ignora las primeras cinco líneas de entrada. En la línea seis, selecciona el cuarto campo y lo asigna a la variablefe
(a la abreviatura de "energía de Fermi".
El código asume que los valores en la columna uno están aumentando, y cuando el primero de estos valores de la primera columna alcanza un valor por encima del valor almacenado en fe
, y si la segunda columna no es -cero, imprime fe
y el valor de la primera columna y sale.
Desafortunadamente, no entiendo completamente su segmento de código más largo ya que no hay una explicación de lo que realmente quiere que haga.