awk(およびgawk):N個の入力ファイルの1つを読み取れないときに致命的なエラーを防ぐ方法

awk(およびgawk):N個の入力ファイルの1つを読み取れないときに致命的なエラーを防ぐ方法

テストケース:(rootは000権限を無視するので、root以外のユーザーを使用してください...)

#in a clean directory:
[ -f file_1 ] && chmod 600 file_? # for repeat tests...
for i in file_1 file_2 file_3; do
    printf 'A\nB\n' > "$i" 
    # we need at least 1 char : awk/gawk silently skips empty files...
done
chmod 000 file_2
awk '(FNR==1) { print FILENAME }' file_? 
  # tried with : regular (old unixes) awk on AIX. and gawk on Linux.
  # the fatal "permission denied" on file_2 stops [g]awk.

致命的なエラーをキャッチして次のファイルを処理し続ける方法はありますか?

(そうでなければ心配です。複数のファイルにawkを使用してもすべてのファイルが処理されるという保証はありません。

可能であれば:答えてください

  • 通常のawkの場合、
  • そして愚かな
  • 他の関連awkバージョンはありますか? (ダメ?など)

ベストアンサー1

GAWKでは:

gawk 'BEGINFILE { if (ERRNO) nextfile } (FNR==1) { print FILENAME }' file_?

BEGINFILEブロックでは、ERRNOファイルが正常に開くと空になります。nextfileこれは、次のファイルにジャンプし、エラーが原因で終了するのを防ぐために使用できます。

私はAWKの他の実装がこれをサポートするとは思わない。

移植可能には、すべての引数を繰り返して読み取れないファイルを指していることを確認し、そうであれば、AWKが手動で処理を開始する前に引数からその引数を削除できます。実装例があります。。ただし、このループを使用してスキャンされたファイルは、AWKが処理を開始する前に読み取れなくなる可能性があるため(その逆も同様)、危険です。

おすすめ記事