2016-05-02 8 views
1

Betrachten Sie den folgenden Befehl in einem Bash-Terminal:sprintf verhält sich anders in GNU Awk 3.1.5 und GNU Awk 3,17

echo 0.00027849383762390271 | awk '{print sprintf("%.20f",$1)}' 

Ich bin auf zwei Maschinen verbunden sind.

Die erste hat GNU Bash Version 4.15 und GNU Awk Version 3.1.7. Der obige Befehl gibt zurück, was erwartet wird: 0,00027849383762390268 (obwohl sich die letzten zwei Ziffern von meiner ursprünglichen Nummer unterscheiden)

Die zweite Maschine hat GNU Bash Version 3.2.39 und GNU Awk Version 3.1.5. Der obige Befehl gibt zurück: 0,00000000000000000000 (20 Nullen nach dem Komma). Beachten Sie das ',' anstelle von '.' .

Warum verhält sich die zweite Maschine anders als die erste und wie verhält sie sich wie die erste Maschine?

Antwort

3

Ihr Gebietsschema unterscheidet sich zwischen den beiden Maschinen. Legen Sie LC_ALL=C (oder das von Ihnen gewünschte Gebietsschema) fest, bevor Sie beide Befehle ausführen. Weitere Informationen finden Sie unter https://www.gnu.org/software/gawk/manual/html_node/Locale-influences-conversions.html.

+0

Ich ssh zu beiden Maschinen vom selben lokalen Computer. Warum verhalten sie sich anders? Gibt es eine Variable, die in den Maschinen anders eingestellt ist? By the way, die LC_ALL, wie Sie vorgeschlagen, funktioniert. Hier ist der gesamte Befehl: 'echo 0.00027849383762390271 | LC_ALL = C awk '{print sprintf ("%. 20f", $ 1)}' ' – dada

+0

Ja, es gibt eine Variable oder eine Konfigurationsdatei, aber idk wo/was. Google 'locale', um mit dem Debuggen zu beginnen. Führen Sie 'env' auf beiden Rechnern aus und suchen Sie nach Unterschieden, etc ... –