Приведение к int в awk

Я ищу метод, чтобы привести строку к int в awk. У меня есть следующее, которое, кажется, делает сравнение строк

(примечание: поле $5 представляет собой процент в одном из двух форматов: 80% или 9.0%)

awk '{if (substr($5,1,(length($5)-1)) >= 90) ...

Итак, когда я изменяю это на:

awk '{if (substr($5,1,(length($5)-1))+0 >= 90+0 ) ...

Это сравнивает, как я хотел. Это подходящий актерский состав? Есть ли лучший способ исполнить актерский состав?

Ответы

Ответ 1

Вы можете просто использовать +0. скажем, переменная v - ваше процентное значение.

$ awk -v v="80.1%" 'BEGIN{print v+0.1}'
80.2

Вам не нужно избавляться от знака %.

Ответ 2

Большинство новых awks имеют функцию int().

Но метод кастинга, задокументированный в "Язык программирования Awk", отображается так же, как вы это делаете, используя numericValue и +0. У меня нет удобной книги, но я думаю, что вы также можете использовать для значения float с помощью +0.0.

Надеюсь, это поможет.

Ответ 3

Согласно документы, int(x) соответствует POSIX. Число все равно будет float (поскольку все числа в awk являются плавающей точкой), но он будет усечен до int.


Добавление 0 не преобразует строку в int. Он преобразует его в float.

Если у вас есть старый awk на основе One True AWK Брайана Кернигана, например macOS awk или FreeBSD awk, вы увидите this в нижней части man-страницы:

BUGS
     There are no explicit conversions between numbers and strings.  To force
     an expression to be treated as a number add 0 to it; to force it to be
     treated as a string concatenate "" to it.

     The scope rules for variables in functions are a botch; the syntax is
     worse.

Чтобы заставить выражение обрабатываться как число, добавьте 0 к нему


Если вам не нравятся поплавки, и у вас есть gawk, вы также можете использовать strtonum


Другие источники:

версия OS X от AWK, которая получена от "The True True AWK" Брайана Кернигана

Все числа в awk являются плавающей точкой:

Поиск" Вся арифметика должна следовать семантике арифметики с плавающей запятой, как указано в стандарте ISO C

Поиск "все числа в awk плавают"