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?
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)
有一个test零大小文件的功能。
if test -s apple.txt
then
## apple.txt non empty
code ...
else
## file empty
fi
Run Code Online (Sandbox Code Playgroud)