4

スクリプトは機能していました。コメントを追加して名前を変更してから送信しました。今日、私のインストラクターは、それが機能せずawk 1 unexpected character '.' 、スクリプトのエラーがコマンドラインで名前を読み取り、名前の学生情報を返すことになっていると私に言いました。今私はそれをチェックしました、そして驚くべきことにそれは私にエラーを与えます。次のようなコマンドで実行する必要があります。

scriptName -v name="aname" -f filename

この問題は何ですか?私のコードのどの部分がそれを引き起こしますか?

#!/usr/bin/awk
BEGIN{
tmp=name;
nameIsValid;
if (name && tolower(name) eq ~/^[a-z]+$/ )
{

    inputName=tolower(name)
    nameIsValid++;
}
else
{
    print "you have not entered the student name"
    printf "Enter the student's name: "
    getline inputName < "-"
    tmp=inputName;
    if (tolower(inputName) eq ~/^[a-z]+$/)
    {
        tmpName=inputName
        nameIsValid++
    }
    else
    {
    print "Enter a valid name!"
    exit
    }
}
inputName=tolower(inputName)
FS=":"
   }
   {
if($1=="Student Number")
{
    split ($0,header,FS)    
}
if ($1 ~/^[0-9]+$/ && length($1)==8)
{
    split($2,names," ")
    if (tolower(names[1]) == inputName || tolower(names[2])==inputName )
    {
        counter++
            for (i=1;i<=NF;i++)
            {
                printf"%s:%s ",header[i], $i

            }

            printf "\n"

    }
}
   }
   END{
   if (counter == 0 && nameIsValid)
   {
 printf "There is no record for the %-10s\n" , tmp 
   }
   }
4

4 に答える 4

3

スクリプトを修正する手順は次のとおりです。

  1. これらの偽のNULLステートメントをすべて削除します(行末のセミコロンを末尾に付けます)。
  2. すべての比較から未設定の変数eq(等式演算子ではありません!)を取り除きます。
  3. インデントをクリーンアップします。
  4. その最初の非機能nameIsValid;ステートメントを取り除きます。
  5. printf "\n"より単純なものに変更しprint ""ます。
  6. 無駄な,FS引数を削除しsplit()ます。
  7. その条件の2番目の部分だけに変更name && tolower(name) ~ /^[a-z]+$/します。これが一致する場合は、もちろん名前が入力されるためです。
  8. これらすべてを取り除き、明示的な範囲tolower()の代わりに文字クラスを使用します。a-z
  9. 変数を取り除きtmpます。
  10. BEGINロジックを簡素化します。
  11. nameIsValid不要な変数を完全に取り除きます。
  12. awkボディをもう少しawkのようにします

そして、これが結果です(サンプルの入出力が投稿されていないため、テストされていません):

BEGIN {
    if (name !~ /^[[:alpha:]]+$/ ) {
        print "you have not entered the student name"
        printf "Enter the student's name: "
        getline name < "-"
    }

    if (name ~ /^[[:alpha:]]+$/) {
        inputName=tolower(name)
        FS=":"
    }
    else {
        print "Enter a valid name!"
        exit
    }
}

$1=="Student Number" { split ($0,header) }

$1 ~ /^[[:digit:]]+$/ && length($1)==8 {

        split(tolower($2),names," ")

        if (names[1]==inputName || names[2]==inputName ) {
            counter++
            for (i=1;i<=NF;i++) {
                printf "%s:%s ",header[i], $i
            }
            print ""
        }
    }
}

END {
    if (counter == 0 && inputName) {
        printf "There is no record for the %-10s\n" , name
    }
}
于 2012-10-24T20:45:33.363 に答える
2

シバンラインを次のように変更しました。

#!/usr/bin/awk -f

次に、コマンドラインで-fを使用しませんでした。現在動作中です

于 2012-10-24T08:18:40.233 に答える
0

次の方法でスクリプトを実行します。

awk -f script_name.awk input_file.txt

これにより、警告とエラーが抑制されるようです。

于 2016-09-26T12:20:51.717 に答える
0

私の場合、問題は、文字列を配列に分割するためのこの回答IFS=","で提案されているようにIFS変数をリセットすることでした。そこで、IFS変数をリセットして、コードを機能させました。

IFS=', '
read -r -a array <<< "$string"
IFS=' ' # reset IFS
于 2019-01-17T11:05:07.520 に答える