Использование переменных if и оболочки внутри сценария awk

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
0
28.02.2018, 01:44
2 ответа

La respuesta a continuación hace una serie de cambios en su técnica.

  1. Hágalo todo en un solo programa awken lugar de dos. Puede hacerlo porque su segunda ejecución solo se ocupa de las líneas después de la línea 6:

  2. Asigne correctamente su valor de energía fermi _de la línea 6.

  3. Ya no es necesario verificar NF==3porque todas las líneas después de la línea 6 cumplen con ese criterio.

  4. Elimine la variable testy, en su lugar, mantengamos una pestaña activa de la diferencia mínima entre fermi_energyy $1. Para eso, crearemos una variable minque 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.

  5. Reemplace su prueba de valor absoluto computacionalmente pesada con una prueba de cero computacionalmente ligera.

  6. Tenga en cuenta que awkadmite 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 mano su motor de búsqueda favorito para obtener más información.

  7. 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
        }'
    
3
28.01.2020, 02:24
awk 'NR == 6 { fe = $4 }
     NR > 6 && $1 > fe && $2 > 0 { print fe, $1; exit }' file

Para los datos de entrada dados en fileesto producirá

1.95329810 4.152

El script awkignora 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 fey 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.

0
28.01.2020, 02:24

Теги

Похожие вопросы