如何评估awk中通过的条件?

时间:2019-03-15 21:05:13

标签: performance awk

用Bash编写的脚本将参数传递给Awk,例如sample_name==10

然后,Awk查找表中的哪一列与sample_name相对应,并重写与表达式左手相对应的参数,例如$1 == 10

但是当条件存储为变量时,我不知道如何实际评估条件。问题主要是因为我们希望能够传递各种条件,包括正则表达式。

因此,我已经编码了一些变通办法,实际上导致了脚本爆炸超出其初衷。

 for (c in where_col) {
      ((where_math[c] == "==" && $where_idx[c] == where_val[c]) ||
      (where_math[c] == ">=" && $where_idx[c] >= where_val[c]) ||
      (where_math[c] == "<=" && $where_idx[c] <= where_val[c]) ||
      (where_math[c] == "!=" && $where_idx[c] != where_val[c]) ||
      (where_math[c] == ">"  && $where_idx[c] >  where_val[c]) ||
      (where_math[c] == "~"  && $where_idx[c] ~  where_val[c]) ||
      (where_math[c] == "<"  && $where_idx[c] <  where_val[c])) {
        #some action
      }

尽管现在可以使用,但我正在寻找一种更简洁的方法。

2 个答案:

答案 0 :(得分:1)

您可能会通过元编程来做到这一点:

您将生成要执行的awk脚本。额外的变量扩展步骤可让您在代码中插入<=。但是,由于您不想允许生成无效或不安全的脚本,因此还需要考虑一些有关可靠性的问题。

您可能可以使用bash中的here-doc在线轻松地做到这一点。

答案 1 :(得分:1)

Awk没有您想要的eval类型的函数 但是(正如您所做的那样),它可以用来编写评估程序。

也许是写一些东西 语言而不是语言可以让您更接近。
否则我不确定awk是您阻力最小的途径

awk -v "lhs=$lhs" -v "op=$op" -v "rhs=$rhs"

op == "==" {result = lhs == rhs}
op == ">=" {result = lhs >= rhs}
op == "<=" {result = lhs <= rhs}
op == "!=" {result = lhs != rhs}
op == ">"  {result = lhs > rhs}
op == "~"  {result = lhs ~ rhs}
op == "<"  {result = lhs < rhs}

END{ #some action involving result
}