Linux 在gawk中将字符串作为命令求值
我需要使用一组在单独文件中维护的规则来确定在gawk脚本中处理的文档是否有效。规则文件包含如下行:Linux 在gawk中将字符串作为命令求值,linux,unix,awk,gawk,Linux,Unix,Awk,Gawk,我需要使用一组在单独文件中维护的规则来确定在gawk脚本中处理的文档是否有效。规则文件包含如下行: record[3]>5&&record[35]~/Boiler/ 将规则文件读入数组后,我现在要检查数组的每一行,以检查每个输入文档的条件是否为真。如下所示,其中使用上述规则计算规则_array[i] for (i=1;i<=rule_count;i++){ if (rule_array[i]){ flag="T" } } for(i=1;i“5.0”和&r
record[3]>5&&record[35]~/Boiler/
将规则文件读入数组后,我现在要检查数组的每一行,以检查每个输入文档的条件是否为真。如下所示,其中使用上述规则计算规则_array[i]
for (i=1;i<=rule_count;i++){
if (rule_array[i]){
flag="T"
}
}
for(i=1;i“5.0”和&record[35]~/Boiler/){
浏览互联网之后,用shell脚本似乎很容易,但这必须在gawk中运行,因为它只是一个庞大脚本的一小部分。使用awk,最接近的东西似乎是以下内容,但我认为这在这里不起作用,因为它不是命令
更新:
为了简化这个问题,我怎样才能得到下面的结果呢?我希望使用“logic”中的逻辑,而不是测试:“logic”不是空的吗
awk'BEGIN{var=2;logic=“var==5”;if(logic){print“TRUE”}}
谢谢
Ger以下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;
以及规则文件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"
}
}
因此
规则数组[i]
包含“record[3]>“5.0”和&record[35]~/Boiler/”并且您希望“评估”如果
,它就在里面?我认为你做不到,尽管我很高兴被证明是错的。也许有更好的方法来解决这个问题,你到底想在这里做什么?为什么不让单独的文件变成一个呆滞的脚本呢?然后你可以提前为每个文件运行它来检查它们是否有效。这就是Tom。我要提供awk脚本将使用的条件列表。需要单独提供这些条件,以便主脚本不会不断被编辑。Håkon,我已经在awk脚本中,输入文件被读入数组(记录[]数组)根据设置的条件进行检查。单独的awk脚本不起作用,因为我可能需要同时检查数组的不同行,例如,如果条件可能是“如果输入文件的第1行等于第9行”,因此我无法逐行处理输入。使用awk的-v
选项,可以将外部变量(如规则)传递给awk内部变量。但是记录
数组我仍然无法从外部传递。感谢@Håkon Hægland。因此不可能将字符串视为条件和唯一的方法这是为了生成一个新脚本?这在这里是不可能的,因为这是一个漫长而复杂的批处理作业的一部分。当前的awk脚本已经有4000行了,所以我不会批准每天重新生成它(风险太大).我想我需要重新考虑一下。@Geraint是的,也许最好将整个脚本转换为面向对象的perl脚本(或python)。然后我认为将来使用它会更简单。.我认为Awk最适合小项目。
BEGIN{
var=2
if( var==5){
print "TRUE1"
}
if( var==2 || var==5){
print "TRUE2"
}
}