Rechenoperation in Textdatei

Rechenoperation in Textdatei

Ich habe eine Datendatei wie folgt;

569158.650000 8.859e-02
579175.970000 8.659e-02
599177.990000 8.659e-02

Ich muss den Wert der ersten Zeile aus der ersten Spalte extrahieren. Dann muss ich die erste Spalte durch 3600 teilen. Schließlich muss ich die Ergebnisse wie folgt als erste Spalte in eine neue Datendatei einfügen:

0 8.859e-02
2.78 8.659e-02
8.33 8.659e-02

Wie kann ich die obige Berechnung mithilfe von Codes durchführen?

Antwort1

Hier ist ein awkEinzeiler zur Lösung des Problems:

awk '{printf "%.2f %s\n", $1/3600, $2}'

Für jede Zeile wird dabei einfach das erste Feld durch 3600 geteilt ( $1/3600) und als Float mit zwei Dezimalstellen ( ) ausgegeben, %.2fgefolgt von einem Leerzeichen, das zweite Feld ( $2) als String ( %s) und schließlich ein Zeilenumbruch. Wenn Sie stattdessen z. B. auf sechs Dezimalstellen runden möchten, ändern Sie einfach %.2fin %.6f.

Beispielausführung

$ 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

Antwort2

#!/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.

Dieses Skript liest aus einer Datei inputim von Ihnen angegebenen Format und gibt in eine Datei mit dem Namen aus output.

Zuerst schneidet es die Zeile in zwei Felder, teilt dann das erste Feld durch 3600, wobei zwei Dezimalstellen gedruckt werden, und druckt anschließend die neue Zahl und die zweite Zahl aus der Zeile in eine Datei mit dem Namen „Ausgabe“.

Es wird keine Fehlerprüfung durchgeführt. Wenn ein Fehler auftritt, kann Ihre Erfahrung abweichen.

verwandte Informationen