Ich habe eine einfache Datei mit einigen numerischen Werten darin:
2018-11-15 14:07:22 37.672 20.553 15.90 4.0
2018-11-17 09:15:46 37.519 20.692 13.80 4.0
2018-11-17 20:33:18 37.540 21.712 9.50 4.2
2018-11-18 05:18:02 37.391 20.516 0.00 4.3
2018-11-18 06:06:44 37.556 20.268 0.00 4.3
2018-11-19 05:56:51 37.565 20.678 14.60 4.2
2018-11-19 13:05:56 37.179 20.580 6.10 5.1
2018-11-19 16:16:41 37.167 20.571 0.10 4.0
Ich möchte nur die dritte und vierte Spalte mit einer Dezimalstelle drucken. Aus diesem Grund mache ich:
awk '{printf "%.1f %.1f\n",$3,$4}' myfile
Das Problem besteht darin, dass es mir Werte mit Nullen im Dezimalteil gibt (diese Ausgabe ist nur ein Beispiel, nicht die Ausgabe der Eingabe):
37,0 20,0
37,0 20,0
40,0 28,0
34,0 26,0
40,0 20,0
34,0 26,0
34,0 26,0
39,0 24,0
37,0 20,0
39,0 24,0
36,0 21,0
37,0 20,0
37,0 20,0
37,0 20,0
Ich weiß wirklich nicht, was los ist ...
Mein Gebietsschema ist:
decimal_point=","
thousands_sep="."
grouping=-1;-1
numeric-decimal-point-wc=44
numeric-thousands-sep-wc=46
numeric-codeset="UTF-8"
Antwort1
Wie in den Kommentaren angedeutet, definiert Ihr Gebietsschema das Komma als korrektes Dezimaltrennzeichen, und genau das scheint Ihr awk zu verwenden.
DerGNU awk-Dokumentationgibt an, dass der Standard dies erfordert, aber (wie hier) wird es oft eher als problematisch angesehen, sodass GNU awk dies nicht standardmäßig tut, sondern nur im POSIX-Modus oder wenn dies mit der --use-lc-numeric
Option angefordert wird.
$ LC_ALL=fi_FI.UTF-8 gawk '{printf "%.1f %.1f\n",$3,$4}' myfile |head -2
37.7 20.6
37.5 20.7
Aber
$ LC_ALL=fi_FI.UTF-8 POSIXLY_CORRECT=1 gawk '{printf "%.1f %.1f\n",$3,$4}' myfile |head -2
37,0 20,0
37,0 20,0
Natürlich gelten für Ihr awk möglicherweise andere Gepflogenheiten, und im Handbuch wird auch erwähnt, dass ältere Versionen von GNU awk auch hier dem Standard entsprachen.
Prüfen Sie die Dokumentation des von Ihnen verwendeten Awk oder legen Sie LC_NUMERIC=C
es beim Ausführen einfach fest, um das Standardgebietsschema zu erzwingen.