2012-04-12 4 views
5

私はawkを使用して、出力ファイルの入力ファイルをフォーマットしています。私は変数を埋めるためにいくつかのパターンを持っています(この例では "some pattern"のように)。これらの変数は、ブロックENDに必要な形式で出力されます。入力ファイルの出現順序は保証されていないため、出力ファイル内の順序は常に同じでなければならないため、出力はそこで行われなければなりません。awk:ENDブロック内にexitをキャッチ

BEGIN { 
    FS = "=|," 
} 


/some pattern/ { 
    if ($1 == 8) { 
     var = $1 
    } else { 
     # Incorrect field value 
     exit 1 
    } 
} 

END { 
    # Output the variables 
    print var 
} 

私の問題はパターン内のexitステートメントです。何らかのエラーがあり、このコマンドが呼び出された場合は、エラーメッセージがまったく出力されません。しかし、gawkのマニュアル(here)によれば、コマンドがパターンブロックで呼び出されると、ENDブロックが少なくとも実行されます。

if (!exit_invoked) { 
    print var 
} 

またはENDブロックで出力を印刷しないようにする他の方法:のようなexitをキャッチする方法はありますか?

ステファン

編集:はshellterからソリューションを使用します。

答えて

6

あなたがexit行の前にexit_invokedを設定することにより、明示的にそれを処理する必要があるでしょう、すなわち

BEGIN { 
    FS = "=|," 
} 


/some pattern/ { 
    if ($1 == 8) { 
     var = $1 
    } else { 
     # Incorrect field value 
     exit_invoked=1 
     exit 1 
    } 
} 

END { 
    if (! exit_invoked ) { 
     # Output the variables 
     print var 
    } 
} 

私はこのことができます願っています。

+0

この単純な解決策については考えていない;)私は 'exit_invoked'セットを忘れないようにするためにこれをパックするだろう。 Stefan – Stefan

+1

@Stefan:いい考えです。あなたがその変数を使用していることを思い出させるために、BEGINブロックに設定することができます。つまり、exit_invoked = 0です。不必要で冗長であると不平を言う人もいます。私はそれを自分ではしませんが、それは良い自己記録技術者です。 YRMV。がんばろう。 – shellter

+0

私は自分自身のために 'awk'プログラムを書いていないので、これを行うでしょう。ありがとう。 – Stefan

-2
END { 
     # If here from a main block exit error, it is unlikely to be at EOF 
     if (getline) exit 
     # If the input can still be read, exit with the previously set status rather than run the rest of the END block. 

     ...... 
関連する問題