我有一个脚本,它生成多个输出文件并在运行时使用这些输出文件。
以下是脚本生成的一些文件: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.csv
nawk
section_fruit_out_lookup.csv
nawk
nawk
section_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
如果第一个文件为空,则根本不运行。
如果(不是您的)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
用于零大小文件的功能。
if test -s apple.txt
then
## apple.txt non empty
code ...
else
## file empty
fi