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

Mur*_*rat 7 bash awk text-processing

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

以下是脚本生成的一些文件: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
Run Code Online (Sandbox Code Playgroud)

这个代码短语主要处理预期的工作。但是,如果apple.txt文件为空(此文件由数据库查询生成),则脚本不会按预期工作。如果apple.txt文件为空,section_fruit_out_lookup.csv则第一nawk部分的输出文件 ( )也会生成为空文件。由于section_fruit_out_lookup.csv生成为空并由第二个nawk命令使用,因此第二个nawk命令也生成一个空输出文件 ( section_fruit_lookup.csv)。

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

Sté*_*las 9

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

awk 'FILENAME == ARGV[1] {...} ...' file1 file2
Run Code Online (Sandbox Code Playgroud)

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

在例(不是你的)file1,并file2必须是同一个文件,你可以这样做:

awk 'FILENAME == ARGV[1] {...} ...' file1 ./file1
Run Code Online (Sandbox Code Playgroud)

或者:

awk 'FILENAME == "-" {...} ...' - <file1 file1
Run Code Online (Sandbox Code Playgroud)

更好的方法(便携且高效):

awk '!file1_processed {...} ...' file1 file1_processed=1 file2
Run Code Online (Sandbox Code Playgroud)

./*.txt例如,如果你需要申请,你会这样做:

set -- ./*.txt
first=$1; shift
awk '!first_processed {...} ...' "$first" first_processed=1 "$@"
Run Code Online (Sandbox Code Playgroud)

awk特定于GNU 的方法:

awk 'ARGIND == 1 {...} ...' file1 file2
Run Code Online (Sandbox Code Playgroud)


Arc*_*mar 7

有一个test零大小文件的功能。

if test -s apple.txt
then 
    ## apple.txt non empty
    code ...
else
    ## file empty
fi
Run Code Online (Sandbox Code Playgroud)