我需要使用一组在单独文件中维护的规则来确定在gawk脚本中处理的文档是否有效。规则文件包含如下行:
record[3] > 5 && record[35] ~ /Boiler/
将规则文件读入数组后,我现在想要遍历数组的每一行,以检查每个输入文档的条件是否为真。类似下面的内容,其中rule_array [i]使用上面的规则进行评估。
for (i=1;i<=rule_count;i++){
if (rule_array[i]){
flag="T"
}
}
如何处理rule_array中的字符串,就像在if语句中使用的命令一样。 if语句应该等同于:
if (record[3] > “5.0” && record[35] ~ /Boiler/){
在浏览互联网之后,在shell脚本中看起来很容易,但这必须在gawk中运行,因为它只是巨大脚本的一小部分。使用awk,最接近的东西似乎是以下,但我认为这不会起作用,因为它不是命令。
AWK - execute string as command?
更新:
为了简化问题,我该如何评估以下内容?我想要逻辑&#34;逻辑&#34;使用,而不是测试:是&#34;逻辑&#34;不是空的。
awk 'BEGIN{var=2;logic="var==5";if(logic){print "TRUE"}}'
谢谢,
GER
答案 0 :(得分:-1)
以下perl脚本将为您生成正确的awk脚本:
#! /usr/bin/perl
use warnings;
use strict;
use File::Slurp qw(read_file);
my $awkcode=read_file('a.awk');
open(my $fh,"<","rules.txt");
while (<$fh>) {
chomp;
my ($key, $val)=/(\S+)(.*)$/;
$awkcode=~s/\Q$key\E/$val/mg;
}
close($fh);
print $awkcode;
给出awk脚本a.awk
:
BEGIN{
var=2
if(logic1){
print "TRUE1"
}
if(logic2){
print "TRUE2"
}
}
和规则文件rules.txt
:
logic1 var==5
logic2 var==2 || var==5
脚本的输出是一个新的awk文件:
BEGIN{
var=2
if( var==5){
print "TRUE1"
}
if( var==2 || var==5){
print "TRUE2"
}
}