Warum ersetzt printf in awk Dezimalzahlen durch Nullen?

Warum ersetzt printf in awk Dezimalzahlen durch Nullen?

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-numericOption 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=Ces beim Ausführen einfach fest, um das Standardgebietsschema zu erzwingen.

verwandte Informationen