использовать оператор IF в AWK

Пробовали ли вы Требуется ?

Требует:Настраивает зависимость требований от других служб. Если эта услуга активируется, перечисленные здесь устройства также активируются. Если одна из зависимых служб не активируется, systemd не запускает эту службу. Эта опция может быть указана более одного раза или вы можете указать несколько единиц, разделенных пробелом -. Ниже приведен образец раздела.

[Unit]
Description=My service
Requires=network.target

Желания:Аналогично требованиям, за исключением того, что неисправные единицы не влияют на службу.

BindsTo:Аналогично Requires, за исключением того, что остановка зависимых модулей также останавливает службу.

PartOf:Аналогично Requires, за исключением того, что остановка и перезапуск зависимых устройств также останавливают и перезапускают службу.

Ссылка:https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/

0
12.05.2021, 23:05
1 ответ

Не многие языки программирования позволяют создавать оператор из содержимого переменной во время выполнения. При разборе кода выражение в условии оператора if -должно быть синтаксически допустимым, а $number variable variable— нет.

(Конечно, в оболочке и test/[вы могли бы сделать, например. [ "$a" "$op" "$b" ], но это потому, что [является командой и анализирует свои аргументы после того, как оболочка расширила переменные.)

У вас есть несколько вариантов.

Вы можете сделать так, чтобы оболочка расширила оператор до того, как awk проанализирует код, что-то вроде этого:

cat temp | awk -F',' -v val="$value" '
               {if($8 '"$function"' val) print $0}' > $destfile

, то если $functionсодержит, например,. <, awk увидит {if($8 < val).... Если вы сделаете это, вы ДОЛЖНЫ убедиться, что $functionявляется приемлемым оператором, прежде чем запускать awk. В противном случае ваши пользователи могут столкнуться с неожиданными синтаксическими ошибками или хуже.


В качестве другой альтернативы пользователь может ввести как нижний, так и верхний предел и всегда проверять оба значения в коде. Замените, например.-inf/ +infили другие достаточно низкие/высокие значения, если пользователь не хочет вводить нижний/верхний предел соответственно.

read -p "Please enter lower limit: " lo
read -p "Please enter upper limit: " hi
cat temp | awk -F',' -v lo="${lo:--inf}" -v hi="${hi:-+inf}" '
               {if (lo <= $8 && $8 <= hi) print $0}' > $destfile

(-inf/ +inf, по-видимому, работают непосредственно в GNU awk и Busybox, mawk, по-видимому, требует принудительного преобразования их в числа с помощью lo + 0 <= $8и т. д.)


Я полагаю, что в GNU awk третьим вариантом будет создание функций для всех различных операторов сравнения, которые вы хотите предоставить, а затем использование косвенных вызовов функций для вызова одного из них на основе имени, заданного в Переменная.

. меньше -, чем и больше -, чем тесты:

read -p "Please input the function (lt or gt): " op
read -p "Please input the value: " value
cat temp | gawk -F',' -v op="$op" -v val="$value" '
                function lt(a, b) { return a < b; }
                function gt(a, b) { return a > b; }
                {if (@op($8, val)) print $0}'

Недостаток этого, конечно, в том, что вам придется явно создавать все функции, и если пользователь введет недопустимое имя функции, вы получите сообщение об ошибке.

7
28.07.2021, 11:33

Теги

Похожие вопросы