在gawk中将字符串评估为命令

时间:2014-05-20 11:11:07

标签: linux unix awk gawk

我需要使用一组在单独文件中维护的规则来确定在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

1 个答案:

答案 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"
    }
}