Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
awk-Problem

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
dopecontrol



Anmeldungsdatum: 10.02.2005
Beiträge: 1

BeitragVerfasst am: 10. Feb 2005 16:35   Titel: awk-Problem

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?? Crying or Very sad

Shell zum Scriptaufruf:
Code:

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


Script:
Code:

BEGIN { \
   a=($1+0);
   if (a < 1000)
      print $1;
   else
      printf("%.12g""\n",a + "irgendeine Zahl");
}


Fehlermeldung:
Code:

linux:/home/all/tfw # awk -f win2linux.awk *.tfw test
awk: win2linux.awk:1: BEGIN { \
awk: win2linux.awk:1:         ^ backslash not last character on line


Für weiterführende Hinweise wäre ich dankbar.

Gruß Otti
 
Benutzer-Profile anzeigen Private Nachricht senden

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 10. Feb 2005 19:12   Titel:

Der GNU-awk hat (zumindest im Vergleich mit anderen Implementierungen) recht aussagekräftige Fehlermeldungen. So auch hier:
Zitat:
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:
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
_________________
Die grösste Lüge der EDV? "Mal eben..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy