awk умова істинного і хибного


9

Я зіткнувся з тим, що якщо ми використовуємо awk 0 inputfile, він не надрукує нічого, оскільки це 0означає помилковий стан.

Якщо ми використовуємо awk 1 inputfile, він надрукує все як 1засоби, що відповідають дійсному інтервалу для кожного рядка.

Якщо ми використовуємо awk any_string inputfile, він нічого не надрукує, оскільки вся змінна awk ініціалізована як нуль, таким чином, помилковою.

Але якщо ми використаємо awk any_integer inputfile, воно стане істинним і надрукує кожен рядок файлу, може я знаю, в чому причина?

Я не можу знайти це, як це було пояснено в посібнику GNUawk .


3
по any_integerЯ вважаю , ви маєте в виду буквальне число , як і 7, 89т.д .. якщо так, то причина будь-яке число , відмінне 0засіб trueумова
Sundeep

Відповіді:


13

Істинним для awk є або не порожній рядок, або ненульове число (при цьому числа підтримуються десятковим цілим чи плаваючою точкою, а також підтримуються шістнадцятковий чи восьмеричний десятки реалізації). Речі, укладені в подвійні лапки, - це рядки, без цитованих буквальних чисел - це числа, але для всього іншого існують складні правила, які визначають, чи потрібно щось трактувати як рядок чи число. Посібник GNU awkмає цілий розділ про це .

Правда:

  • 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яке є ненульовим числом).

Це означає, що якщо ви хочете перевірити, чи рядок не порожній, ви не повинні робити:

awk '$ 1 {print $ 1, "is not empty"}

Але

awk '$1 != "" {print $1, "is not empty"}'

Інакше це не скаже 0або -0000E+00001234не є порожнім.


Вражаюча і детальна відповідь! Хоча одне питання: на останньому прикладі, який ви подали, я спробував синтаксис, і перший працює, де він пропускає $ 1, який порожній, і друкує лише той рядок, який не є порожнім $ 1, бо якщо $ 1 порожній рядок, це буде Неправдиво і, таким чином, не друкується вихід, чи не так?
sylye
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.