用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
}
尽管现在可以使用,但我正在寻找一种更简洁的方法。
答案 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
}