sidoline: AWK Programm verstehen

Hallo,

ich habe leider nur begrenzt ahnung von awk. Ich brauche für meine Diplomarbeit ein awk-skript. Ich selber programmiere in Java und habe das awk programm so wie ich es verstanden habe umgeschrieben. Allerdings kommen bei meinem Programm andere Werte raus als bei dem Awk skript. Ich hab das Programm so verstanden, dass es die Werte am Anfang in das jeweilige Array speichert, den Eingabestring liest und jedem Letter den entsprechenden Wert aus dem Array zuweist und das über den Eingabestring aufsummiert. Also letzenendlich: Eingabestring: ABC --> Ergebnis= (Wert für Array A an Stelle 1)+(Wert für Array B an Stelle 2)+(Wert für Array C an Stelle 3).

Gibt es in awk irgendwelche seltsamen aufrundefunktionen oder steckt noch mehr in dem skript?

Hier ist das skript:

  
BEGIN {  
A = " -0.02 -0.05 -0.07 -0.11 0.79 0.79 0.79 0.79 0.79 0.69 0.46 0.30 0.15"  
C = " 1.61 3.21 4.87 7.30 6.35 6.35 6.35 6.35 6.35 0.37 0.25 0.16 0.08"  
D = " 0.14 0.29 0.44 0.65 4.91 4.91 4.91 4.91 4.91 0.53 0.35 0.23 0.12"  
E = " 0.49 0.98 1.48 2.22 5.14 5.14 5.14 5.14 5.14 2.47 1.65 1.09 0.54"  
F = " 0.05 0.09 0.14 0.21 -1.17 -1.17 -1.17 -1.17 -1.17 0.79 0.53 0.35 0.17"  
G = " -0.11 -0.22 -0.33 -0.50 1.95 1.95 1.95 1.95 1.95 0.05 0.03 0.02 0.01"  
H = " -0.08 -0.16 -0.24 -0.37 1.74 1.74 1.74 1.74 1.74 0.13 0.09 0.06 0.03"  
I = " 0.34 0.69 1.04 1.56 -2.05 -2.05 -2.05 -2.05 -2.05 0.17 0.11 0.08 0.04"  
K = " -0.28 -0.56 -0.85 -1.28 0.40 0.40 0.40 0.40 0.40 -1.62 -1.08 -0.71 -0.36"  
L = " 0.56 1.12 1.70 2.54 -3.62 -3.62 -3.62 -3.62 -3.62 -0.03 -0.02 -0.01 -0.01"  
M = " 0.03 0.05 0.08 0.12 1.10 1.10 1.10 1.10 1.10 0.26 0.17 0.11 0.06"  
N = " 0.25 0.49 0.74 1.12 2.36 2.36 2.36 2.36 2.36 -0.44 -0.29 -0.19 -0.10"  
P = " 0.05 0.10 0.15 0.22 1.63 1.63 1.63 1.63 1.63 -0.42 -0.28 -0.18 -0.09"  
Q = " -0.37 -0.74 -1.13 -1.69 1.60 1.60 1.60 1.60 1.60 -0.22 -0.15 -0.10 -0.05"  
R = " -0.39 -0.78 -1.19 -1.78 -0.79 -0.79 -0.79 -0.79 -0.79 -2.58 -1.72 -1.14 -0.57"  
S = " -0.04 -0.09 -0.13 -0.20 1.27 1.27 1.27 1.27 1.27 -0.34 -0.23 -0.15 -0.07"  
T = " -0.30 -0.60 -0.91 -1.36 0.27 0.27 0.27 0.27 0.27 -0.73 -0.48 -0.32 -0.16"  
V = " -0.08 -0.17 -0.26 -0.39 -1.75 -1.75 -1.75 -1.75 -1.75 1.05 0.70 0.46 0.23"  
W = " -0.14 -0.29 -0.43 -0.65 3.49 3.49 3.49 3.49 3.49 0.17 0.12 0.08 0.04"  
Y = " 0.06 0.13 0.19 0.29 -1.88 -1.88 -1.88 -1.88 -1.88 1.73 1.15 0.76 0.38"  
X = " 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00"  
  
}  
{  
split(A,AA);  
split(C,CC);  
split(D,DD);  
split(E,EE);  
split(F,FF);  
split(G,GG);  
split(H,HH);  
split(I,II);  
split(K,KK);  
split(L,LL);  
split(M,MM);  
split(N,NN);  
split(P,PP);  
split(Q,QQ);  
split(R,RR);  
split(S,SS);  
split(T,TT);  
split(V,VV);  
split(W,WW);  
split(Y,YY);  
split(X,XX);  
  
{      for (j=1; j<= 1; j++)   {  
 for (i=0;i<= 12; i++) {  
  
if (substr($3,i+j,1) == "A") {sum += AA[i+1]; continue}  
if (substr($3,i+j,1) == "C") {sum += CC[i+1]; continue}  
if (substr($3,i+j,1) == "D") {sum += DD[i+1]; continue}  
if (substr($3,i+j,1) == "E") {sum += EE[i+1]; continue}  
if (substr($3,i+j,1) == "F") {sum += FF[i+1]; continue}  
if (substr($3,i+j,1) == "G") {sum += GG[i+1]; continue}  
if (substr($3,i+j,1) == "H") {sum += HH[i+1]; continue}  
if (substr($3,i+j,1) == "I") {sum += II[i+1]; continue}  
if (substr($3,i+j,1) == "K") {sum += KK[i+1]; continue}  
if (substr($3,i+j,1) == "L") {sum += LL[i+1]; continue}  
if (substr($3,i+j,1) == "M") {sum += MM[i+1]; continue}  
if (substr($3,i+j,1) == "N") {sum += NN[i+1]; continue}  
if (substr($3,i+j,1) == "P") {sum += PP[i+1]; continue}  
if (substr($3,i+j,1) == "Q") {sum += QQ[i+1]; continue}  
if (substr($3,i+j,1) == "R") {sum += RR[i+1]; continue}  
if (substr($3,i+j,1) == "S") {sum += SS[i+1]; continue}  
if (substr($3,i+j,1) == "T") {sum += TT[i+1]; continue}  
if (substr($3,i+j,1) == "V") {sum += VV[i+1]; continue}  
if (substr($3,i+j,1) == "W") {sum += WW[i+1]; continue}  
if (substr($3,i+j,1) == "Y") {sum += YY[i+1]; continue}  
if (substr($3,i+j,1) == "X") {sum += XX[i+1]; continue}  
  
      }  
  print  sum ,";;;";  
  sum=0;}  
print $0 }}  
  

Viele Grüße

  1. Hi sidoline,

    ich habe zwar nicht wirklich genau verstanden, was du tust, aber folgendes sieht nicht richtig aus:

    {      for (j=1; j<= 1; j++)   {

    Diese Schleifendeklaration sagt, dass der Block genau einmal auszuführen ist; damit ist diese Schleife überflüssig - vielleicht wolltest du hier ja was anderes?

    Grüße,
    Richard

    1. Hi,

      hab das Programm nicht geschrieben. Hab mich auch schon darüber gewundert, aber vermutlich muss man das in awk so machen.

      Hi sidoline,

      ich habe zwar nicht wirklich genau verstanden, was du tust, aber folgendes sieht nicht richtig aus:

      {      for (j=1; j<= 1; j++)   {
      Diese Schleifendeklaration sagt, dass der Block genau einmal auszuführen ist; damit ist diese Schleife überflüssig - vielleicht wolltest du hier ja was anderes?

      Grüße,
      Richard

      1. hab das Programm nicht geschrieben. Hab mich auch schon darüber gewundert, aber vermutlich muss man das in awk so machen.

        Nein, muss man nicht. Eine Schleife, die genau einmal ausführt wird, ist in AWK genauso überflüssig wie in allen anderen Sprachen.

        So ein Kontrukt macht lediglich dann Sinn, wenn der Anwender durch austauschen der "1" in j<= 1 das Script an eigene Bedürfnisse anpassen kann.