複数の出力ファイルを生成し、実行時にこれらの出力ファイルを使用するスクリプトがあります。
以下は、スクリプトによって生成されたいくつかのファイルです:apple.txt
、、、、、、。section_fruit_out.csv
section_fruit_out_lookup.csv
food_lookup.csv
section_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.csv
nawk
section_fruit_out_lookup.csv
nawk
nawk
section_fruit_lookup.csv
nawk
ファイルが空の場合は、最初のコマンドを無視してapple.txt
2番目の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
答え2
test
サイズが0のファイルの機能があります。
if test -s apple.txt
then
## apple.txt non empty
code ...
else
## file empty
fi