Описание тега xvfb
Разумный способ проверки, нужно сравнить поле с помощью тестов, похожими на strtod
, которая является метод, что awk используется для преобразования строк в числа:
$2 !~ / *[+-]?[[:цифра:]]/ { печати "НЭН:" $2; покинуть 1; }
Выше отличается от strtod в том, что он не считает бесконечность или NaN для "цифры". Ведущие космические требования могут быть смягчены в области расщепления по умолчанию на awk поведение -- значение поля не будет содержать пробел:
$2 !~ /[+-]?[[:цифра:]]/ { печати "НЭН:" $2; покинуть 1; }
Дальнейшее усовершенствование, благодаря Стефан комментарий и ответ здесь:
$2 !~ /^[+-]?([[:digit:]]*\.?[[:digit:]]*([eE][-+]?[[:digit:]]+)?|0[xX][[:xdigit:]]*\.?[[:xdigit:]]*([pP][-+]?[[:digit:]]+)?)$/ { печать "НЭН:" 2$; Выход 1; }
Вспыхнули чуть лучше удобочитаемость, что регулярное выражение:
/^[+-]?([[:цифра:]]*\.?[[:цифра:]]*([УО][-+]?[[:цифра:]]+)?|\
0[ХХ][[:xdigit:]]*\.?[[:xdigit:]]*([пп][-+]?[[:цифра:]]+)?)$/
... , где намерение состоит в том, чтобы разрешить возможные ведущие + или -, тогда как число с плавающей точкой или шестнадцатеричное число. В число с плавающей запятой имеет дополнительные цифры, вариант сепаратора (здесь исправлены в срок .
), затем некоторое количество цифр, дополнительно сопровождаемый экспонентой. Шестнадцатеричные числа должны начинаться с 0х
или 0х
, следуют шестнадцатеричные цифры, разделитель, более шестнадцатеричных цифр, и при необходимости с последующим "власть" (экспонента). Всего второе поле должно соответствовать одному из этих форматов (как якоря ^
и $
). Опущены здесь для целей настоящего вопрос, являются НЭН и вариантов бесконечность.
Другим вариантом было бы заставить числовое преобразование, а затем сравнить его с нуля и потом сравнить исходное на то, что бы преобразовать к нулю; более конкретно, она начинается с необязательного + или -, то следуют нули, или за которым следует точка и нули:
{ число=0 + $2;
если (!количество && $2 !~ /^[+-]?(0+)|\.0+/)
печать "НАНА: "$2;
}