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?

¿Fue útil?

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: ")
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top