Del archivo sourceAWK.txt
• Se abre la máquina virtual de MSDOS
• Se edita el archivo sorceAWK.txt
• Se copia y pega las primeras tres líneas de código (una del comentario y dos de código) dentro de un archivo de texto
• Se seleccionan las tres calculadoras del código
sourceAWK.txt y se copian dentro de otro archivo.
• Se ejecuta el archivo de 3 líneas con el de las calculadoras.
• Se observa lo que realiza AWK
Código en AWK ¿Qué hace?
# unbundle - unpack a bundle into separate files
$1 != prev { close(prev); prev = $1 }
{ print substr($0, index($0, " ") + 1) >$1
}
Código en AWK ¿Qué hace?
# desenreda(separa) – desempaca un paquete de código dentro de
archivos separados
$1 != prev { close(prev); prev = $1 }
{ print substr($0, index($0, " ") + 1) >$1 }
($1 significa para awk el primer campo de un registro
$2 es el segundo campo del registro
$3 es el tercer campo del registro y así sucesivamente…)
!= (significa diferentes expresiones) prev #campo anterior que compara
dentro del archivo con el campo
actual y define si es diferente
Código en AWK ¿Qué hace?
$0 #significa todo el registro para awk
{ close(prev); #signfica que crea un archivo al cerrarlo
{ close(prev); prev = $1 }
{ print substr($0, index($0, " ") + 1)
>$1 }
Código en AWK ¿Qué hace?
prev = $1 #Significa que elimina el primer registro por espacio o nada.
{ print substr #imprime ($0, #el registro completo
index($0, " ") + 1) >$1 } #Elimina la primera
columna
PASO 1.
1. Crear en un el editor de MS-DOS, el archivo s.awk con el contenido de las 3 líneas de código ya explicadas que se encuentran en el archivo sourceAWK.txt descargado y des-compactado del site: UPIICSA Sara Mendez
C:\_ edit s.awk <enter>
NOTA: Si se crea el archivo en el block de notas,
automaticamente éste le agrega al archivo
creado la extensión .txt y así no trabaja el
interpréte de AWK
Contenido del archivo s.awk
# unbundle - unpack a bundle into separate files
$1 != prev { close(prev); prev = $1 }
{ print substr($0, index($0, " ") + 1) >$1 }
PASO 2.
Se crea otro archivo con el contenido de las tres calculadoras CALC1 CALC2 CALC3 tomadas del sourceAWK.txt con un copy/paste
Con el nombre de cs.txt
NOTA: recuerde que es mejor hacerlo con el editor de MS-DOS
Edit cs.txt (y su contenido es…)
Contenido del cs.awk
calc1 # calc1 - reverse-Polish calculator, version 1 calc1 # input: arithmetic expressions in reverse Polish calc1 # output: values of expressions
calc1
calc1 { for (i = 1; i <= NF; i++)
calc1 if ($i ~ /^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)$/) { calc1 stack[++top] = $i
calc1 } else if ($i == "+" && top > 1) { calc1 stack[top-1] += stack[top]; top-- calc1 } else if ($i == "-" && top > 1) { calc1 stack[top-1] -= stack[top]; top-- calc1 } else if ($i == "*" && top > 1) { calc1 stack[top-1] *= stack[top]; top-- calc1 } else if ($i == "/" && top > 1) { calc1 stack[top-1] /= stack[top]; top-- calc1 } else if ($i == "^" && top > 1) { calc1 stack[top-1] ^= stack[top]; top-- calc1 } else {
calc1 printf("error: cannot evaluate %s\n", $i) calc1 top = 0
calc1 next calc1 }
calc1 if (top == 1)
calc1 printf("\t%.8g\n", stack[top--]) calc1 else if (top > 1) {
calc1 printf("error: too many operands\n") calc1 top = 0
calc1 } calc1 }
Continua contenido de cs.awk
calc2 # calc2 - reverse-Polish calculator, version 2 calc2 # input: expressions in reverse Polish calc2 # output: value of each expression calc2
calc2 { for (i = 1; i <= NF; i++)
calc2 if ($i ~ /^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)$/) { calc2 stack[++top] = $i
calc2 } else if ($i == "+" && top > 1) { calc2 stack[top-1] += stack[top]; top-- calc2 } else if ($i == "-" && top > 1) { calc2 stack[top-1] -= stack[top]; top-- calc2 } else if ($i == "*" && top > 1) { calc2 stack[top-1] *= stack[top]; top-- calc2 } else if ($i == "/" && top > 1) { calc2 stack[top-1] /= stack[top]; top-- calc2 } else if ($i == "^" && top > 1) { calc2 stack[top-1] ^= stack[top]; top-- calc2 } else if ($i == "sin" && top > 0) { calc2 stack[top] = sin(stack[top]) calc2 } else if ($i == "cos" && top > 0) { calc2 stack[top] = cos(stack[top]) calc2 } else if ($i == "atan2" && top > 1) {
calc2 stack[top-1] = atan2(stack[top-1],stack[top]); top-- calc2 } else if ($i == "log" && top > 0) {
calc2 stack[top] = log(stack[top]) calc2 } else if ($i == "exp" && top > 0) { calc2 stack[top] = exp(stack[top])
Final del archivo cs.awk
calc3 # calc3 - infix calculator calc3
calc3 NF > 0 { calc3 f = 1 calc3 e = expr()
calc3 if (f <= NF) printf("error at %s\n", $f) calc3 else printf("\t%.8g\n", e)
calc3 } calc3
calc3 function expr( e) { # term | term [+-] term calc3 e = term()
calc3 while ($f == "+" || $f == "-")
calc3 e = $(f++) == "+" ? e + term() : e - term() calc3 return e
calc3 } calc3
calc3 function term( e) { # factor | factor [*/] factor calc3 e = factor()
calc3 while ($f == "*" || $f == "/")
calc3 e = $(f++) == "*" ? e * factor() : e / factor() calc3 return e
calc3 } calc3
calc3 function factor( e) { # number | (expr) calc3 if ($f ~ /^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)$/) { calc3 return $(f++)
calc3 } else if ($f == "(") { calc3 f++
calc3 e = expr() calc3 if ($(f++) != ")")
calc3 printf("error: missing ) at %s\n", $f) calc3 return e
calc3 } else {
calc3 printf("error: expected number or ( at %s\n", $f) calc3 return 0
calc3 } calc3 }