【问题标题】:Evaluate a string as a command in gawk将字符串评估为 gawk 中的命令
【发布时间】:2014-05-20 11:11:06
【问题描述】:

我需要使用一组保存在单独文件中的规则来确定在 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] &gt; “5.0” &amp;&amp; record[35] ~ /Boiler/){

在互联网上搜索后,shell 脚本似乎很容易,但这必须在 gawk 中运行,因为它只是庞大脚本的一小部分。使用 awk,最接近的似乎是以下内容,但我认为这在此处行不通,因为它不是命令。

AWK - execute string as command?

更新:

为了简化问题,我怎样才能得到以下评估。我希望使用“逻辑”中的逻辑,而不是测试:“逻辑”不是空的。

awk 'BEGIN{var=2;logic="var==5";if(logic){print "TRUE"}}'

谢谢,

德国

【问题讨论】:

  • 所以 rule_array[i] 包含 "record[3] > "5.0" && record[35] ~ /Boiler/" 并且您想在 if 中添加 "eval" 吗?我不认为你能做到这一点,尽管我很高兴被证明是错误的。也许有更好的方法来解决这个问题,你到底想在这里做什么?
  • 为什么不把单独的文件变成一个 gawk 脚本呢?然后你可以提前为每个文件运行它来检查它们是否有效..
  • 正是汤姆。我想提供一个 awk 脚本将使用的条件列表。它们需要单独提供,这样主脚本就不会经常被编辑。
  • Håkon,我已经在一个 awk 脚本中,其中输入文件被读入数组(record[] 数组),以根据设定的标准进行检查。一个单独的 awk 脚本不起作用,因为我可能需要同时检查数组的不同行,例如if条件可能是“如果输入文件的第1行等于第9行”,所以我不能逐行处理输入。
  • 使用 awk 的-v 选项,可以将外部变量(如您的规则)传递给 awk 内部变量。但是record数组我还是无法从外面通过。

标签: linux unix awk gawk


【解决方案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"
    }
}

【讨论】:

  • 感谢@Håkon Hægland。所以不可能将字符串视为条件,这样做的唯一方法是生成一个新脚本?这是不可能的,因为这是一个漫长而复杂的批处理作业的一部分。当前的 awk 脚本已经有 4000 行长,所以我不会获得批准每天重新生成它(风险太大)。我认为我需要重新考虑这一点。
  • @Geraint 是的,最好将整个脚本转移到面向对象的 perl 脚本(或 python)。那么我认为以后使用起来会更简单。我认为 awk 最适合小型项目。
猜你喜欢
  • 2017-07-06
  • 1970-01-01
  • 2023-04-09
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
相关资源
最近更新 更多