如果输入文件为空,则绕过 nawk 片段

如果输入文件为空,则绕过 nawk 片段

我有一个脚本,它生成多个输出文件并在运行时使用这些输出文件。

以下是脚本生成的一些文件: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输出文件 ( )也生成为空。由于生成为空并且由第二个命令使用,因此第二个命令也会生成一个空的输出文件 ( )。section_fruit_out_lookup.csvnawksection_fruit_out_lookup.csvnawknawksection_fruit_lookup.csv

如果文件为空,如何绕过第一个nawk命令apple.txt并使第二个nawk命令使用section_fruit_out.csv文件而不是使用文件:section_fruit_out_lookup.csv

答案1

您可以执行以下操作,而不是测试NR == FNR是否正在处理第一个文件:

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

但这是一个更昂贵的测试,所以如果file1是常规文件,您不妨使用@Archemar 的方法awk如果第一个文件为空,则根本不运行。

如果(不是您的)file1file2必须是同一个文件,您可以执行以下操作:

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用于零大小文件的功能。

if test -s apple.txt
then 
    ## apple.txt non empty
    code ...
else
    ## file empty
fi

相关内容