operación aritmética en archivo de texto

operación aritmética en archivo de texto

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 awklí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 %.2fa %.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 inputen 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.

información relacionada