No es posible hacer una función factorial en AWK
Pregunta
El código
#!/usr/bin/awk
# Sed and AWK by O'Reilly (p.179)
# Example of what should happen: factorial 5 gives
# factorial
# Enter number: 3
# The factorial of 3 is 6
BEGIN {
printf("Enter number: ")
}
$1 ~ /^[0-9]+$/ {
# assign value of $1 to number & fact
number = $1
if (number == 0)
fact = 1
else
fact = number
for (x = 1; x < number; x++)
fact *=x
printf("The factorial of %d is %g\n", number, fact)
exit
}
# if not a number, prompt again.
{ printf("\nInvalid entry. Enter a number: ")
}
funciono con el comando sin éxito por
./factorial.awk
consigo
/usr/bin/awk: syntax error at source line 1
context is
>>> <<< ./factorial.awk
/usr/bin/awk: bailing out at source line 1
¿Qué significa el mensaje de error?
Solución
Creo que el problema es que usted está escribiendo un script de shell y pasándolo a awk para su ejecución. La siguiente es una secuencia de comandos shell, de ahí el #! /bin/sh
, por lo que se pasará a la carcasa (-compatible Bourne en este caso).
#! /bin/sh
awk 'BEGIN { printf("Hello world!\n"); exit }'
El ella-bang (#!) Línea le dice al intérprete intérprete corriente que pase a la secuencia de comandos para su ejecución. Usted tiene que pasar el script para el intérprete awk
por lo que necesita para llamar awk
explícitamente. Esto supone que awk
está en su camino a alguna parte.
A continuación, sin embargo, es una secuencia de comandos awk
.
#! /usr/bin/awk -f
BEGIN {
printf("Hello world!\n");
exit
}
El ella-bang invoca awk
y pasa a la secuencia de comandos como entrada. No es necesario invocar explícitamente awk
en este caso y que no tiene que citar todo el guión, ya que se pasa directamente a awk
.
Piense en la que ella-bang diciendo tomar lo que sigue el ella-bang, añadir el nombre del archivo, y ejecutarlo . Wikipedia describe el uso bastante bien incluyendo algunas formas comunes para resolver el ruta de acceso al intérprete problema.
Otros consejos
Posiblemente una respuesta tonta, pero en mi terminal que tendría que escribir:
./factorial.awk
donde está el archivo factorial.awk.
Se puede editar la variable de entorno PATH para incluir. pero ./ debería funcionar bien creo. Y la adición. a $ PATH podría llegar a ser muy peligroso en algunas situaciones que permiten la ejecución de código que usted no esperaba a.
funciona eso ??
EDIT:
./ factorial.awk -bash: ./factorial.awk: / usr / bin / gawk: mala intérprete: No existe el fichero o directorio
Eso dice que corrió el archivo, pero no pudo encontrar el programa de gawk. Por favor, escriba 'que gawk' y luego 'que awk'.
¿Se supone que su primera línea a ser:
#!/usr/bin/awk
Además, sólo para divertirme, escriba:
sudo apt-get install gawk
Esto se asegurará de que usted realmente tiene gawk en su sistema.
Edit2: Me tomó un vistazo a su código y esto es lo que tengo ahora. Quité dos citas y un guión.
#!/usr/bin/gawk
# I think we do not need these (p.179) so I comment them out, since I do not know where else to put them.
# The same bug occurs also with them.
#fact = number
#for (x = number -1 ; x > 1; x--)
# fact *= x
awk # factorial: returns factorial of user-supplied number
BEGIN {
printf("Enter number: ")
}
$1 ~ /^[0-9]+$/ {
# assign value of $1 to number & fact
number = $1
if (number == 0)
fact = 1
else
fact = number
#loop to multiply fact*x until x = 1
for (x = number - 1; x > 1; x--)
fact *= x
printf("The factorial of %d is %g\n", number, fact)
#exit -- saves user from typing ^-d
exit
}
# if not a number, prompt again.
{ printf("\nInvalid entry. Enter a number: ")
}
puede ser que no era tan complicado.
#! / Usr / bin / awk ---------> #! / Usr / bin / awk -f
Compruebe si hay un archivo de /usr/bin/gawk
; si no, utilizar el camino de awk o la ubicación correcta para gawk.
Además, ¿hizo el script ejecutable?
Y también, ¿tiene el directorio actual en su camino?
Me dio la escritura para trabajar en Ubuntu y OS X ejecutando
awk -f factorial.awk
Parece que no se puede ejecutar la secuencia de comandos de la siguiente manera aunque el libro lo dice
./factorial.awk
Aquí hay una versión recursiva:
#!/usr/bin/awk -f
function f(x) {
if (x <= 1) return 1
return (f(x-1) *x)}
BEGIN {
printf("Enter number: ")
}
$1 ~ /^[0-9]+$/ {
printf("The factorial of %d is %d\n", $1, f($1))
exit
}
{ printf("\nInvalid entry. Enter a number: ")
}