1

if elseでステートメントを使用していawkます。使用するたびに構文エラーが発生します。誰かがこれを使用する方法を教えてもらえますか?以下に示す構文エラーが発生します。

コード:

awk '{ FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}'

出力:

awk: { FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}

awk:                                                                                            ^ syntax error

awk: { FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}

awk:                                                                                                     ^ syntax error

awk: { FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}

awk:                                                                                                                                ^ syntax error
4

3 に答える 3

3

最初の問題は、3つの右中括弧のシーケンスでスクリプト全体が終了したため、残りの行で構文エラーが発生することです。

if条件内にステートメントもありifます。

あなたが何を書きたかったのかわかりませんが、このようなものがあなたが考えていたものかもしれません:

{ 
    FS = "=";
    if ($1 ~ /Hi/) {
        if (!($1=="Hi")) {print $1;}
    } else if ($1=="bye") {
        print $1;
    } else if ($1=="good") {
        print $1;
    }
} 
END {
    print $1
}

http://ideone.com/srNzp

于 2012-06-24T07:52:43.897 に答える
1

問題

コードには多くの問題があります。中かっこが不均衡で、間隔が狭いなど、デバッグを困難にする問題があります。最終的には、構文と引用の問題が発生します。

ソリューション

スクリプトの外部で割り当てをFSに移動することで、コードを簡略化できます。これははるかに読みやすく、エラーが発生しにくくなります。例えば:

$ echo "foo=bar" | awk -F= '{print $1}'
foo

実行時に別の何かに再割り当てする場合を除いて、わかりやすくするために割り当てをBEGINブロックに移動することもできます。

BEGIN { FS = "=" }

他に何をするにしても、読みやすくするためにコードをリファクタリングすると、スクリプトのデバッグがはるかに簡単になります。

于 2012-06-24T07:55:54.357 に答える
0
{if(if($1=="good") {print $1;}}}

間違っている。最初の中括弧は、丸括弧の1つだけが閉じられている2番目の閉じ括弧で閉じられます。

詳細:if(ifはかなり間違っているようです。他の構成要素を続けると修復される可能性がありますが、ほとんどの場合、if(a && b))を使用して複数の条件を組み合わせるか、if(a)if(b)c else d 。

 {if($1=="good") {print $1;}} 

ここで意味されているようです。すぐに私はもっと見つけようとします。

はい-他に類を見ない中括弧があります。オールマンスタイルのインデントを使用して、それを制御することを検討できます。すべての{の前に改行を入れ、その後、ブレースが閉じるまで新しいインデントレベルを設定します。見て:

awk '{ FS = "=" ;
if($1 ~ /Hi/) 
{
    if (!($1=="Hi")) 
    {
        print $1;
    }
} else 
{
    if($1=="bye") 
    {
        print $1;
    }
}
} // <- doesn't match any open brace
else 
{
    if ($1=="good") 
    {
        print $1;
    }
}
} // <- again
END {print $1}'

多くの編集者は、中括弧の1つの横にカーソルを置くと、一致する中括弧を強調表示するのに役立ちます。比類のない閉じ中括弧が少なくとも2つあります。

于 2012-06-24T07:54:15.070 に答える