Нет, но у вас есть пара опций, самый простой из которых - позволить оболочке развернуть одну из переменных, чтобы она стала частью сценария awk, прежде чем awk запустит его:
$ operator='>'; comparison='3'
$ echo 5 | awk -v c="$comparison" '$1 '"$operator"' c'
5
В противном случае вы можете написатьваша собственная функция eval
-стиля, например:
$ cat tst.awk
cmp($1,o,c)
function cmp(x,y,z, cmd,line,ret) {
cmd = "awk \047BEGIN{print (" x " " y " " z ")}\047"
if ( (cmd | getline line) > 0 ) {
ret = line
}
close(cmd)
return ret
}
$ echo 5 | awk -v c="$comparison" -v o="$operator" -f tst.awk
5
См. https://stackoverflow.com/a/54161251/1745001. Последняя будет работать, даже если ваша awk-программа была сохранена в файле, а первая - нет.Если вы хотите смешать библиотеку функций со скриптами командной строки, то вот один способ с GNU awk для -i
:
$ cat tst.awk
function cmp(x,y,z, cmd,line,ret) {
cmd = "awk \047BEGIN{print (" x " " y " " z ")}\047"
if ( (cmd | getline line) > 0 ) {
ret = line
}
close(cmd)
return ret
}
$ awk -v c="$comparison" -v o="$operator" -i tst.awk 'cmp($1,o,c)'
5