-1

コード

 #!/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: ")
 }

によってコマンドを実行できませんでした

./factorial.awk

私は得る

/usr/bin/awk: syntax error at source line 1
 context is
         >>>  <<< ./factorial.awk
/usr/bin/awk: bailing out at source line 1

エラーメッセージはどういう意味ですか?

4

7 に答える 7

4

問題は、シェルスクリプトを作成し、それをawkに渡して実行することだと思います。以下はシェルスクリプトであるため、#! /bin/shシェルに渡されます(この場合はBourne互換)。

#! /bin/sh
awk 'BEGIN { printf("Hello world!\n"); exit }'

she-bang(#!)行は、実行のためにスクリプトを渡すインタープリターを現在のインタープリターに指示します。スクリプトをawkインタプリタに渡す必要があるため、awk明示的に呼び出す必要があります。awkこれは、それがどこかのパスにあることを前提としています。

ただし、以下はawkスクリプトです。

#! /usr/bin/awk -f
BEGIN {
    printf("Hello world!\n");
    exit
}

she-bangはawk、スクリプトを呼び出して入力として渡します。この場合、明示的に呼び出す必要はありませawkん。また、スクリプトはに直接渡されるため、スクリプト全体を引用する必要はありませんawk

she-bangは、she-bangの後に続くものを取得し、ファイルの名前を追加して実行すると言っていると考えてください。ウィキペディアは、インタプリタの問題へのパスを解決するためのいくつかの一般的な方法を含め、使用法をかなりよく説明しています。

于 2009-04-25T15:59:17.410 に答える
3

おそらくばかげた答えですが、私の端末では次のように入力する必要があります。

./factorial.awk

ここで、ファイルはfactorial.awkです。

パス環境変数を編集して、を含めることができます。しかし、./はうまくいくはずだと思います。そして追加します。$ PATHへの変換は、予期しないコードを実行する状況では非常に危険であることが判明する可能性があります。

それは動作しますか??

編集:

./factorial.awk -bash:./factorial.awk:/ usr / bin / gawk:不正なインタプリタ:そのようなファイルまたはディレクトリはありません

これは、ファイルを実行したが、プログラムgawkが見つからなかったことを示しています。「whichgawk」、「whichawk」の順に入力してください。

あなたの最初の行は次のようになっていますか?

#!/usr/bin/awk

また、私を楽しませるために、次のように入力します。

sudo apt-get install gawk

これにより、システムに実際にgawkがインストールされていることを確認できます。

EDIT2:私はあなたのコードを調べました、そしてこれは私が今持っているものです。2つの引用符とダッシュを削除しました。

#!/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: ")
}
于 2009-04-24T23:51:37.593 に答える
3

それほど複雑ではなかったのかもしれません。

#!/ usr / bin / awk --------->#!/ usr / bin / awk -f

于 2009-06-23T02:39:18.490 に答える
2

ファイルがあるかどうかを確認します/usr/bin/gawk; そうでない場合は、awkのパスまたはgawkの正しい場所のいずれかを使用します。

また、スクリプトを実行可能にしましたか?

また、PATHに現在のディレクトリがありますか?

于 2009-04-25T00:02:48.347 に答える
1

実行することで、UbuntuとOSXでスクリプトを動作させることができました

awk -f factorial.awk

本にはそう書いてありますが、次のようにスクリプトを実行することはできないようです。

./factorial.awk 
于 2009-04-25T21:59:59.180 に答える
0

再帰バージョンは次のとおりです。

#!/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: ")
}
于 2009-06-25T06:29:33.910 に答える
0

この質問は、検索フレーズ「awk factorial」のGoogleでのトップヒットだったので、awkで階乗を印刷する簡単な方法は次のとおりです。

$ awk 'BEGIN{x=1;for(i=2;i<=6;i++)x*=i;print x}'
720

シェル関数として(後のスペース-vは、macOSに付属しているnawkには必要ですが、gawkには必要ありません):

$ fac(){ awk -v "n=$1" 'BEGIN{x=1;for(i=2;i<=n;i++)x*=i;print x}';}
$ fac 6
720

kの組み合わせを計算するためのawk関数として:

$ awk 'function f(x){r=1;for(i=2;i<=x;i++)r*=i;return r}BEGIN{n=5;k=3;print f(n)/(f(k)*f(n-k))}'
10
于 2021-04-17T17:46:44.997 に答える