Tengo un archivo de datos de la siguiente manera;
569158.650000 8.859e-02
579175.970000 8.659e-02
599177.990000 8.659e-02
Necesito extraer el valor de la primera fila de la primera columna. Luego necesito dividir la primera columna entre 3600. Finalmente, necesito pegar los resultados como la primera columna en un nuevo archivo de datos de la siguiente manera;
0 8.859e-02
2.78 8.659e-02
8.33 8.659e-02
¿Cómo puedo hacer el cálculo anterior usando códigos?
Respuesta1
Aquí hay una awk
línea para resolver el problema:
awk '{printf "%.2f %s\n", $1/3600, $2}'
Para cada línea, esto simplemente divide el primer campo por 3600 ( $1/3600
) y lo imprime como un flotante con dos decimales ( %.2f
) seguido de un espacio, el segundo campo ( $2
) como una cadena ( %s
) y finalmente una nueva línea. Si desea redondear, por ejemplo, a seis decimales, simplemente cambie %.2f
a %.6f
.
Ejecución de ejemplo
$ cat <data
569158.650000 8.859e-02
579175.970000 8.659e-02
599177.990000 8.659e-02
$ awk '{printf "%.2f %s\n", $1/3600, $2}' <data >new_data
$ cat <new_data
158.10 8.859e-02
160.88 8.659e-02
166.44 8.659e-02
$ awk '{printf "%.6f %s\n", $1/3600, $2}' <data
158.099625 8.859e-02
160.882214 8.659e-02
166.438331 8.659e-02
Respuesta2
#!/bin/bash
div=3600 #Divisor
scale=2 #Scale for output. Number of digits after decimal point.
while read -r line #Read file into variable line, line by line.
do
firstnum=$(echo $line | cut -d " " -f 1) #Pick the first number field
secondnum=$(echo $line | cut -d " " -f 2) #Pick the second number field
firstnum=$(echo "scale=${scale}; ${firstnum}/${div}" | bc -l) #Divide by $div with $scale places after decimal point.
echo "${firstnum} ${secondnum}" >> output #Output first and second column, seperated by space,to file named output.
done < input #input is name of input file.
Este script lee un archivo nombrado input
en el formato que usted dijo y lo genera en un archivo llamado output
.
Primero corta la línea en dos campos y luego divide el primer campo por 3600 con dos decimales impresos y luego imprime el nuevo número y el segundo número de la línea en un archivo llamado salida.
No realiza ninguna comprobación de errores. Si se encuentra un error, YMMV.