Как оценить условия пройденные в awk? - PullRequest
0 голосов
/ 16 марта 2019

Сценарий, написанный на 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 ]

1 голос
/ 16 марта 2019

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
}

1 голос
/ 16 марта 2019

Вы, вероятно, сделаете это с помощью метапрограммирования:

Вы бы сгенерировали сценарий awk для выполнения. Дополнительный шаг расширения переменной позволяет вам вставить, например, <= в код. Но это требует дополнительных размышлений о надежности, так как вы не хотите разрешать создание недействительных или небезопасных сценариев.

Вы, вероятно, можете легко сделать это с помощью документа here в bash.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...