Login
Newsletter
Werbung

Thema: GNU awk 4.0 veröffentlicht

4 Kommentar(e) || Alle anzeigen ||  RSS || Kommentieren
Kommentare von Lesern spiegeln nicht unbedingt die Meinung der Redaktion wider.
1
Von Lexi am Di, 5. Juli 2011 um 20:59 #

Haben Sie meinen Beitrag überhaupt gelesen? Sieht nicht so aus. Es geht nicht um das Können. Es geht darum, dass GAWK Zahlen wie 3.14 falsch einliest, wenn die Systemeinstellung auf das Komma eingestellt ist. Und genau dieses Verhalten ist nicht dokumentiert und man erwartet es auch nicht von einer Programmiersprache(!). Das Standardverhalten von Perl ist wahrscheinlich ein anderes. Das von Python ist anders. Wenn man Python eine Zahl als String übergibt, schaut Python auch nicht in die Systemeinstellungen. Füttert man Gnuplot mit Daten, nimmt Gnuplot auch den Dezimalpunkt, egal was in der Systemeinstellung steht. Textausgaben aller prominenten Programmiersprachen (Python, Java, C, C++, Ruby usw. usf.) schreiben Zahlen mit Dezimalpunkt und niemals mit Komma.

Und was besser ist, ist gerade nicht Ansichtssache. Immer diese Phrasen... Das ist wie "Über Geschmack lässt sich nicht streiten." - Damit erstickt man jede Diskussion im Keim und es wird gähnend langweilig.

(G)AWK wird von Programmierern benutzt. Programmierer erwarten es, dass eine Programmiersprache den Dezimalpunkt verwendet, genauso wie Autofahrer erwarten, dass das Bremspedal links vom Gaspedal ist. Als ich während meiner Diplomarbeit Statistiken ausgewertet habe (mithilfe von GAWK), ist mir die Sache mit den Dezimaltrennzeichen anfangs gar nicht aufgefallen. Wenn aus Zahlen wie 134.23 eine 134 wird und AWK aus hunderten solcher Werte einen Mittelwert bildet, dann fällt das nicht auf. Werden die Zahlen kleiner, gewinnt der Nachkommaanteil an Gewicht und dann fällt es auf. Es hat bestimmt drei Wochen gebraucht, bis mir der Fehler aufgefallen ist.

Und das allerschlimmste es: Die Sache ist nicht(!) dokumentiert. Ich habe das Handbuch durchgestöbert und nix gefunden, ob man vielleicht dem AWK per Option sagen kann, was das Dezimaltrennzeichen ist. Irgendwann kam ich dann mal auf den Trichter, dass GAWK in die Systemeinstellungen schaut und das war dann auch die Lösung. Und selbst wenn es dokumentiert wäre, wäre das nur wenig besser. Um zurückzukommen auf mein Beispiel mit dem Auto und dem Bremspedal: Ein solches Auto würde nie zugelassen, auch wenn im Handbuch steht, dass das Bremspedal rechts sei. Beim Auto ist es lebenswichtig, dass man in einer Gefahrsituation schnell reagiert und da zählt das Gewohnte. AWK und ein bisschen Statistik ist jetzt nicht lebenswichtig, aber der Anwender soll damit gut klarkommen können. Sowas nennt man Ergonomie.

Ich weiß nicht, ob Sie jetzt ein Mann oder eine Frau sind. Ziehen Sie sich mal eine Jacke des anderen Geschlechts an und machen Sie die Knöpfe zu. Da können Sie an sich beobachten, wie wichtig der gewohnte Ablauf ist und ein eingeübter Handgriff ist. Ich selbst hatte vor ein paar Wochen eine Frauenjacke an, weil es spät war, kalt wurde und ich keine Jacke dabei hatte. Ich habe für das Schließen der Knöpfe drei- bis viermal so viel Zeit benötigt als ich es von meinen Jacken oder Mänteln her kenne.

Dieser Beitrag wurde 1 mal editiert. Zuletzt am 05. Jul 2011 um 23:16.
  • 0
    Von ThorstenS am Di, 5. Juli 2011 um 21:49 #

    Ich kann echt gut nachvollziehen was du damit meinst. Mir war das noch nichtmal bewußt und nutze schon drei-vier mal die Woche awk.

    /thorsten

    1
    Von finger am Di, 5. Juli 2011 um 22:22 #

    Ich bin mir nicht sicher, ob Du gut genug gesucht hast.

    POSIX awk:

    A string value shall be converted to a numeric value by the equivalent of the following calls to functions defined by the ISO C standard:

    setlocale(LC_NUMERIC, "");
    numeric_value = atof(string_value);

    sowie

    LC_NUMERIC

    Determine the radix character used when interpreting numeric input, performing conversions between numeric and string values, and formatting numeric output. Regardless of locale, the period character (the decimal-point character of the POSIX locale) is the decimal-point character recognized in processing awk programs (including assignments in command line arguments).

    POSIX erwartet also, dass man LC_NUMERIC respektiert.. ausser im Falle von awk und ich kann das in zwei von drei awks reproduzieren:


    $ echo 0.1 0.1 | LC_ALL=en_US.UTF-8 gawk '{print $1+$2}'
    0.2
    $ echo 0.1 0.1 | LC_ALL=de_DE.UTF-8 gawk '{print $1+$2}'
    0.2

    $ echo 0.1 0.1 | LC_ALL=en_US.UTF-8 nawk '{print $1+$2}'
    0.2
    $ echo 0.1 0.1 | LC_ALL=de_DE.UTF-8 nawk '{print $1+$2}'
    0

    $ echo 0.1 0.1 | LC_ALL=de_DE.UTF-8 mawk '{print $1+$2}'
    0.2
    $ echo 0.1 0.1 | LC_ALL=en_US.UTF-8 mawk '{print $1+$2}'
    0.2

    $ echo 0.1 0.1 | LC_ALL=en_US.UTF-8 gawk --use-lc-numeric '{print $1+$2}'
    0.2
    $ echo 0,1 0,1 | LC_ALL=en_US.UTF-8 gawk --use-lc-numeric '{print $1+$2}'
    0

    $ echo 0.1 0.1 | LC_ALL=de_DE.UTF-8 gawk --use-lc-numeric '{print $1+$2}'
    0
    $ echo 0,1 0,1 | LC_ALL=de_DE.UTF-8 gawk --use-lc-numeric '{print $1+$2}'
    0,2

    Bei nawk scheints ein Bug zu sein, welcher unterdessen Behoben sein sollte:

    http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=42320


    Überprüfe also, welches awk du wie verwendest.


    p.s.

    $ gawk --version
    GNU Awk 3.1.8
    Copyright (C) 1989, 1991-2010 Free Software Foundation.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program. If not, see http://www.gnu.org/licenses/.

Pro-Linux
Traut euch!
Neue Nachrichten
Werbung