入力ファイルが空の場合、nawk フラグメントをバイパスします。

入力ファイルが空の場合、nawk フラグメントをバイパスします。

複数の出力ファイルを生成し、実行時にこれらの出力ファイルを使用するスクリプトがあります。

以下は、スクリプトによって生成されたいくつかのファイルです:apple.txt、、、、、、。section_fruit_out.csvsection_fruit_out_lookup.csvfood_lookup.csvsection_fruit_lookup.csv

次のコードフレーズがあります。

nawk 'FNR == NR && NF!=0 {x[$1] = $1; next;} {FS=OFS=","} FNR>1{if ($2 in x) {($6 = "apple")} } 1' apple.txt section_fruit_out.csv > section_fruit_out_lookup.csv 
nawk 'BEGIN { FS = OFS = ","; } FNR == NR { x[$1] = $2; next; } { if ($7 in x && $6 == "") { $6 = x[$7]; } else if ($6 == "" && $7 != "") { $6 = "TO_BE_DEFINED" } } 1' food_lookup.csv section_fruit_out_lookup.csv  > section_fruit_lookup.csv

このコード構文は、主に期待される操作を処理します。ただし、apple.txtファイルが空の場合(ファイルがデータベースクエリによって生成された場合)、スクリプトは期待どおりに機能しません。ファイルが空の場合、apple.txt最初の部分()の出力ファイルも空になります。ビルドは空で2番目のコマンドで使用されるため、2番目のコマンドも空の出力ファイル()を生成します。section_fruit_out_lookup.csvnawksection_fruit_out_lookup.csvnawknawksection_fruit_lookup.csv

nawkファイルが空の場合は、最初のコマンドを無視してapple.txt2番目のnawkコマンドsection_fruit_out.csvでファイルを使用させるにはどうすればよいですかsection_fruit_out_lookup.csv

ベストアンサー1

NR == FNR最初のファイルが処理されているかどうかをテストする代わりに、次のことができます。

awk 'FILENAME == ARGV[1] {...} ...' file1 file2

ただし、これはコストがかかるテストなので、file1通常のファイルの場合は次のようにすることをお勧めします。@Archemarのやり方awk最初のファイルが空の場合、まったく実行されません。

(あなたのものではない)とfile1同じfile2ファイルでなければならない場合は、次のことができます。

awk 'FILENAME == ARGV[1] {...} ...' file1 ./file1

または:

awk 'FILENAME == "-" {...} ...' - <file1 file1

より良い方法(携帯可能で効率的):

awk '!file1_processed {...} ...' file1 file1_processed=1 file2

たとえば、適用する必要がある場合は、./*.txt次のようにします。

set -- ./*.txt
first=$1; shift
awk '!first_processed {...} ...' "$first" first_processed=1 "$@"

GNUawk固有の方法:

awk 'ARGIND == 1 {...} ...' file1 file2

おすすめ記事