Подтвердить что ты не робот

Как проверить, является ли значение переменной в AWK script нулевым или пустым?

  • Я использую AWK script для обработки некоторых журналов.
  • В одном месте мне нужно проверить, является ли значение переменной null или пустым, чтобы принять какое-то решение.

Любая идея, как добиться того же?

awk '

{
    {
       split($i, keyVal, "@")
       key=keyVal[1];
       val=keyVal[2];
       if(val ~ /^ *$/)
       val="Y";

    }

}

' File

Я пробовал с

1) if(val == "")

2) if(val ~ /^ *$/)

не работает в обоих случаях.

4b9b3361

Ответ 1

Сравнение с "" должно было работать, так что бит нечетный

В качестве еще одной альтернативы вы можете использовать функцию length(), если она равна нулю, ваша переменная имеет значение null/empty. Например.

if (length(val) == 0)

Кроме того, может понадобиться встроенная переменная NF (количество полей)? Поскольку у нас нет доступа к вашим входным данным, сложно сказать, но еще одна возможность.

Ответ 2

Он отлично работает для меня

$ awk 'BEGIN{if(val==""){print "null or empty"}}'
null or empty

Вы не можете различать между пустой и пустой переменными, когда вы получаете доступ к переменной "unset", awk просто инициализирует ее значением по умолчанию (здесь это "" - пустая строка). Вы можете использовать какое-то обходное решение, например, при установке переменной val_accessed на 0, а затем на 1 при доступе к ней. Или более простой подход (несколько "хакерский" ), устанавливающий значение val в "unitialized" (или какое-то другое значение, которое не может появиться при запуске вашей программы).

PS: ваш script выглядит странно для меня, какие вложенные скобки для?

Ответ 3

Вы можете напрямую использовать переменную без сравнения, пустое/нулевое значение считается false, все остальное - true.

Смотрите здесь:

# setting default tag if not provided
if (! tag) {
        tag="devf"
}

Таким образом, этот script будет иметь переменную tag со значением devf, за исключением случаев, когда пользователь вызывает это следующим образом:

$ awk -v tag=custom -f script.awk targetFile

Это верно: GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)