awk-Problem

Post Reply
Message
Author
dopecontrol
Posts: 1
Joined: 10. Feb 2005 13:09

awk-Problem

#1 Post by dopecontrol »

Hallo alle miteinander,
ich bin der Script-Programmierung nicht ganz so mächtig und hab folgendes Problem. Ich will per awk-Script (win2linux) unter Suse 9.2 in vielen tfw-Files Änderungen in jeweils 2 Zeilen machen. Ich habe folgendes Script gefunden, was diese Arbeit erledigen soll. Allerdings bekomme ich nach Programmaufruf immer eine Fehlermeldung. Was ist falsch?? :cry:

Shell zum Scriptaufruf:

Code: Select all

 for i in *.tfw
 do 
  awk -f win2linux.awk $i> $$ 
  cp $$ $i
  rm $$
 done
Script:

Code: Select all

BEGIN { \
   a=($1+0);
   if &#40;a < 1000&#41;
      print $1;
   else
      printf&#40;"%.12g""\n",a + "irgendeine Zahl"&#41;;
&#125; 
Fehlermeldung:

Code: Select all

linux&#58;/home/all/tfw # awk -f win2linux.awk *.tfw test
awk&#58; win2linux.awk&#58;1&#58; BEGIN &#123; \
awk&#58; win2linux.awk&#58;1&#58;         ^ backslash not last character on line
Für weiterführende Hinweise wäre ich dankbar.

Gruß Otti

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#2 Post by jochen »

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 &#123;
   a=&#40;$1+0&#41;;
   if &#40;a < 1000&#41;
      print $1;
   else
      printf&#40;"%.12g""\n",a + "irgendeine Zahl"&#41;;
&#125; 
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
Die grösste Lüge der EDV? "Mal eben..."

Post Reply