Ich versuche, eine Datei zu manipulieren, die Zahlen in wissenschaftlicher Notation enthält, aber ohne das e
Symbol, dh 1.2e+3
geschrieben als 1.2+3
.
Die einfachste Sache , die ich dachte , mit zu tun , awk
war zu ersetzen +
mit e+
, die unter Verwendung von gsub
Funktion und meine Berechnung in der neuen Datei zu tun. Gleiches gilt für den Minusfall. Eine einfache Korrektur kann also mit dem folgenden Befehl durchgeführt werden
awk '{gsub("+", "e+", $1); print $1, $2, $3, $4, $5}' file_in
und machen Sie dasselbe in allen Spalten.
Die Datei enthält jedoch auch negative Zahlen, was die Sache etwas komplizierter macht. Eine Beispieldatei ist unten zu sehen
1.056000+0 5.000000-1 2.454400-3 2.914800-2 8.141500-6
2.043430+1 5.000000-1 2.750500-3 2.698100-2-2.034300-4
3.829842+1 5.000000-1 1.969923-2 2.211364-2 9.499900-6
4.168521+1 5.000000-1 1.601262-2 3.030919-2-3.372000-6
6.661784+1 5.000000-1 5.250575-2 3.443669-2 2.585500-5
7.278104+1 5.000000-1 2.137055-2 2.601701-2 8.999800-5
9.077287+1 5.000000-1 1.320498-2 2.961020-2-1.011600-5
9.248130+1 5.000000-1 3.069610-3 2.786329-2-6.317000-5
1.049935+2 5.000000-1 4.218794-2 3.321955-2-5.097000-6
1.216283+2 5.000000-1 1.432105-2 3.077165-2 4.300300-5
Irgendeine Idee, wie man mit einer solchen Datei manipuliert und berechnet?
text-processing
awk
Danke
quelle
quelle
Antworten:
Ist diese Ausgabe korrekt?
Code:
Erläuterung:
-lne
Achten Sie auf Zeilenenden, verarbeiten Sie jede Eingabezeile und führen Sie den folgenden Code auss/(\.\d+)(\+|\-)/\1e\2/g
::s
)(.\d+)(\+|\-)
finde zwei Gruppen von (einem Punkt und Zahlen) und (einem Plus oder Minus)\1e\2
Ersetzen Sie sie durch die erste Gruppe unde
dann durch die zweite Gruppeg
global - hören Sie nicht bei der ersten Ersetzung in jeder Zeile auf, sondern verarbeiten Sie alle möglichen Trefferprint
Drucken Sie die Zeilesample
EingabedateiDieser fügt Platz hinzu, wenn er fehlt. Tatsächlich wird unabhängig davon ein Leerzeichen zwischen den Zahlen eingefügt. Dh. Wenn in einigen Fällen zwei Leerzeichen vorhanden wären, wäre nur eines in der Ausgabe vorhanden.
Das meiste davon ähnelt dem vorherigen. Das Neue ist die
(\d+)
Gruppe Nr. 3 und die(\s*)
Gruppe Nr. 4.*
Hier bedeutet optional. In der Substitution wird nein\4
verwendet. Es gibt stattdessen ein Leerzeichen.Die Ausgabe ist folgende:
quelle
.
in der ersten Gruppe zuvor einen Backslash hinzugefügt habe . Das ist richtig. Ohne diesen Backslash würde der Punkt keinen wörtlichen Punkt bedeuten.Sie könnten auch verwenden
sed
, zB:Dies berücksichtigt jedoch nicht, dass die Spalten in der OP-Liste manchmal nicht getrennt sind. Hier ist eine Problemumgehung mit angemessener Genauigkeit:
Ausgabe:
quelle
2.698100-2-2.034300-4
OFMT
Variable verwendet, um die Genauigkeit von awk auf die gleiche wie die der Eingabe zu setzen