Я сталкивался с тем, что, если мы используем awk 0 inputfile
, он не будет печатать что-либо, потому что 0
означает ложные условия.
Если мы используем awk 1 inputfile
, он напечатает все как 1
среднее значение true для каждой строки, которую интерпретирует awk.
Если мы используем awk any_string inputfile
, он ничего не печатает, потому что все переменные awk инициализируются как ноль, таким образом, false.
Но если мы используем awk any_integer inputfile
его, оно станет правдой и напечатает каждую строку файла, могу ли я знать, в чем причина?
Я не могу найти это было объяснено в GNU awk
вручную , хотя.
any_integer
Я полагаю , вы имеете в виду буквальное число , как и7, 89
т.д .. если да, то причина любое число , отличное0
средствоtrue
условиеОтветы:
Истина для awk - это либо непустая строка, либо ненулевое число (с числами, являющимися десятичным целым числом или с плавающей запятой, а также с некоторыми реализациями awk, также поддерживаются шестнадцатеричные или восьмеричные). Вещи, заключенные в двойные кавычки, являются строками, буквенные числа без кавычек - это числа, но для всего остального существуют сложные правила, позволяющие определить, следует ли что-то рассматривать как строку или число. В
awk
руководстве GNU есть целая глава об этом .Правда:
awk '1'
(ненулевое число)awk '1e8'
(ненулевое число)awk '-0.01'
(ненулевое число)awk '"foo"'
(непустая строка)awk '"0"'
(непустая строка)awk '0 ""'
(конкатенация дает строку, которая здесь не пуста)echo 0 | awk '$1 ""'
(то же самое для поля $ n)awk 'substr("000", 1, 1)'
(результатомsubstr()
всегда является строка)echo '0foo' | awk '$0'
($ 0 - нечисловая строка, поэтому рассматривается как строка (не пустая))Ложь:
awk '0'
(0 число)awk '""'
(пустой строкой)echo 0000e123 | awk '$1'
($ 1 считается числом, если это числовая строка, которая здесь и равна 0)echo ' 0 ' | awk '$0'
(начальные и конечные пробелы игнорируются, чтобы определить, является ли строка числовой).awk '" 2foo" - 2'
(строка, содержащаяся в арифметическом выражении, преобразуется в число, при этом все, что находится за номером, игнорируется)awk 'unset_or_empty_variable'
(пустой строкой)awk '"non-numerical-string" + 0'
YMMV:
awk '1e-500'
(некоторые будут жаловаться, некоторые будут воспринимать это как 0)awk '"0x1" + 0'
(не все реализации awk поддерживают шестнадцатеричные числа, в тех, которые делают"0x1"
, преобразуются1
в другие, в0
некоторые. Некоторые версии спецификации POSIX непреднамеренно требовали реализации для поддержки этого шестнадцатеричного числа, и оно было отозвано позже. Темgawk
не менее распознает это шестнадцатеричное число, когда оноPOSIXLY_CORRECT
находится в окружение)awk '010 - 8'
(то же самое (ну, не совсем так, как 010 здесь буквально, а не преобразовано из строки) для восьмеричных)awk '0x1 - 1'
(вawk
реализациях, которые не поддерживают шестнадцатеричные числа,0x1
это конкатенация0
иx1
переменная, которая выдает,"0"
которая преобразуется в число (0), если вычесть,1
вы получите-1
ненулевое число).Это означает, что если вы хотите проверить, не является ли строка непустой, вам не следует делать:
Но
В противном случае он не сказал бы
0
или-0000E+00001234
не является пустым.источник