• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

awk-Problem

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

Shell zum Scriptaufruf:
Code:
 for i in *.tfw
 do 
  awk -f win2linux.awk $i> $$ 
  cp $$ $i
  rm $$
 done

Script (win2linux):
Code:
begin {
{
a=($1+0);
if (a < 1000)
print $1;
else 
printf("%.12g""\n",a + "Variable");
}
}

Fehler:

linux:/home/all/tfw # awk -f win2linux.awk *.tfw a.txt
awk: win2linux.awk:1: BEGIN {
' in expressionawk:1: ^ invalid char '

Für Hinweise wäre ich sehr dankbar

mfg Otti :?:
 

snaewe

Hacker
Versuch mal:
Code:
BEGIN { \
...
...

in 'win2linux.awk'. (also nur einen \ hinzufügen).

Stefan
 
OP
D

dopecontrol

Newbie
Hi,
funzt leider nicht, kommt dann als Fehler:

awk: win2linux.awk:1: BEGIN { \
awk: win2linux.awk:1: ^ backslash not last character on line

gruß otti
 

snaewe

Hacker
dopecontrol schrieb:
Hi,
funzt leider nicht, kommt dann als Fehler:

awk: win2linux.awk:1: BEGIN { \
awk: win2linux.awk:1: ^ backslash not last character on line

gruß otti
Ja, dann mach doch das letzte Zeichen mal weg, so dass der '\' das letzte Zeichen ist!

EDIT: Warum ist im BEGIN-Block noch ein Block mit '{ }' ?

Stefan
 
OP
D

dopecontrol

Newbie
alles probiert, mit begin , ohne, mit klammern, ohne klammern; immer wieder:

awk: win2linux.awk:1: ^ backslash not last character on line

klingt für mich (als laien) eher danach, dass am ende eben kein backslash stehen soll oder darf

otti
 

snaewe

Hacker
dopecontrol schrieb:
alles probiert, mit begin , ohne, mit klammern, ohne klammern; immer wieder:

awk: win2linux.awk:1: ^ backslash not last character on line

klingt für mich (als laien) eher danach, dass am ende eben kein backslash stehen soll oder darf
Nö.
Die Übersetzung lautet doch wohl
Rückwärtsschrägstrich (ist) nicht das letzte Zeichen der Zeile
oder?

Versuch's so
Code:
BEGIN { \
	a=($1+0);
	if (a < 1000)
		print $1;
	else
		printf("%.12g""\n",a + "Variable");
}
Bei mir meckert da keiner.

Stefan
 
OP
D

dopecontrol

Newbie
awk --version
GNU Awk 3.1.4
Copyright (C) 1989, 1991-2003 Free Software Foundation.

type -a awk
awk is /usr/bin/awk
awk is /bin/awk


type -a gawk
gawk is /usr/bin/gawk
gawk is /bin/gawk
 

snaewe

Hacker
Ich kann das irgendwie nicht glauben.
Bei mir funktioniert es mit und ohne '\'.
Zeig mal einen Hexdump deiner 'win2linux.awk' ('hd win2linux.awk' oder 'hexdump -C win2linux.awk')

Stefan
 

oc2pus

Ultimate Guru
lass mal dos2unix über deine script-datei laufen, evtl sind es nur die "falschen" Zeilenterminierungen...
 
OP
D

dopecontrol

Newbie
linux:/home/all/tfw # hexdump -C win2linux.awk
00000000 42 45 47 49 4e 20 7b 20 5c 0d 0a 20 20 20 61 3d |BEGIN { \.. a=|
00000010 28 24 31 2b 30 29 3b 0d 0a 20 20 20 69 66 20 28 |($1+0);.. if (|
00000020 61 20 3c 20 31 30 30 30 29 0d 0a 20 20 20 20 20 |a < 1000).. |
00000030 20 70 72 69 6e 74 20 24 31 3b 0d 0a 20 20 20 65 | print $1;.. e|
00000040 6c 73 65 0d 0a 20 20 20 20 20 20 70 72 69 6e 74 |lse.. print|
00000050 66 28 22 25 2e 31 32 67 22 22 5c 6e 22 2c 61 20 |f("%.12g""\n",a |
00000060 2b 20 36 36 36 29 3b 0d 0a 7d 20 |+ 666);..} |
0000006b
 

regexer

Advanced Hacker
dopecontrol schrieb:
linux:/home/all/tfw # hexdump -C win2linux.awk
00000000 42 45 47 49 4e 20 7b 20 5c 0d 0a 20 20 20 61 3d |BEGIN { \.. a=|
Bingo! Linux mag kein 0d 0a als Zeilenende sondern nur nur 0a. oc2pus hat also recht ...
 

regexer

Advanced Hacker
deac schrieb:
warum schreibst du es nicht gleich in die commandline?

awk '{a=...}'
Auch das ist richtig. Das BEGIN sollte man weglassen. So sollte es funktionieren:
Code:
{
a=($1+0);
if (a < 1000)
print $1;
else
printf("%.12g""\n",a + "Variable");
}
Wobei ich nicht weiß, was das "Variable" bewirken soll ...
 
Oben