Der GNU-awk hat (zumindest im Vergleich mit anderen Implementierungen) recht aussagekräftige Fehlermeldungen. So auch hier:
backslash not last character on line
Der Backslash \ muss also letztes Zeichen der Zeile sein. Wenn Du das Skript mittels Copy'n'Paste übernommen hast, dann ist das Lehrzeichen nach dem Backslash der Übeltäter.
Am einfachsten wäre es, Du löschst das Backslash-Zeichen direkt mit. Das muss dort nämlich gar nicht stehen. Schreib es einfach so:
Code: Select all
BEGIN {
a=($1+0);
if (a < 1000)
print $1;
else
printf("%.12g""\n",a + "irgendeine Zahl");
}
Aber das war nur der Syntax-Fehler! Die logischen Fehler kommen jetzt:
- Alles, was auf die Auswahlbedingung BEGIN hin folgt, wird pro Aufruf genau einmal ausgeführt, und zwar bevor auch nur die erste Zeile der Eingabedateien gelesen wird. In der zu BEGIN gehörenden Aktion verwendest Du aber $1, d.h. Du greifts auf den Inhalt des ersten Feldes einer Eingabezeile zu. Das kann aber nicht funktionieren, weil bei BEGIN per Definition eben noch nichts gelesen wurde!
- Mittels der folgenden Anweisungen wird geschaut, ob im ersten Feld der Eingabezeile ein numerischer Wert grösser 1000 vorliegt. Falls ja, wird dieser unverändert ausgegeben, falls nein, der Wert anders formatiert ausgegeben. Aber die Ausgabe ergibt keinen Sinn.
"%.12g" steht für "Gleitkommazahl mit max. 12 Ziffern", wobei der Punkt nicht gerechnet wird. Als Zahl auszugeben ist wieder der Wert des ersten Feldes plus der Zeichenkette "irgendeine Zahl", was der awk als ein + 0 interpretiert. Keine Ahnung, was das bezwecken will...
Kann es vielleicht sein, dass Du da etwas wortwörtlich übernommen hast, was noch für den jeweiligen Zweck angepasst werden muss?
Jochen