Заставьте awk использовать bash с помощью команды system()

Заставьте awk использовать bash с помощью команды system()

Есть ли способ заставить awk использовать bash вместо sh при запуске системных команд с помощью system()вызова?

Я хочу использовать некоторые специфичные для bash функции, такие как операторы сравнения строк [[ ]] и < >:

gawk 'BEGIN {system("if [[ \"porc\" == \"porc\" ]]; then echo yes; else echo no; fi")}'
sh: [[: not found

решение1

Если вам нужен bash, вам придется либо пропатчить gawk, либо вызвать bash напрямую (цитирование становится немного странным):

gawk 'BEGIN {
    script="if [[ \"porc\" == \"porc\" ]]; then echo yes; else echo no; fi"
    system("bash -c '\''" script "'\''")
}'

решение2

awkможет делать эти вещи сам по себе:

$ awk 'BEGIN { if ("A" < "B") print "A < B"; else print "A >= B" }'
A < B

Он даже обрабатывает регулярные выражения:

$ awk 'BEGIN { if ("thing" ~ "^t") print "t-something"; else print "not t-something" }'
t-something

Или, если взять ваш пример:

$ awk 'BEGIN { if ("porc" == "porc") print "yes"; else print "no" }'
yes

Использование внешней команды awkдля system()вызова чрезвычайно медленно и также делает невозможным получениевыходиз этой команды в любой пригодной для использования форме в awkсамой программе.

Связанный контент