awk-if столбец = null

используя awk, как бы вы назначили "null" значение для чтения?

Я уверен, что для этого есть установленный символ, я просто не могу его найти.

например,

У меня есть строка awk, как это:

awk '
==24{print "stuff"}
==23{print "stuff"}
'

Мне нужно знать, как учитывать пустые столбцы, используя тот же формат, так что если $3 = пусто {печатать "вещи"}

спасибо!

2 ответов


попробуйте сделать это :

awk '
    ==24{print "stuff"}
    ==23{print "stuff"}
    !{print "null"}
' file.txt

Если вам нужно обработать если это ноль (false на awk), попробуйте сделать это :

! &&  != 0{print "null"}

в обработке awk по умолчанию нет такой вещи, как "пустой" столбец.

поля разделяются пробелами, т. е. на один или пробелы (вкладки и пробелы, в основном). Итак, учитывая этот ввод:

this that the_other
foo       bar

для первой строки , и are this, that и the_other, соответственно, а для второй строки bar и , независимо от того, сколько пробелов между первым и вторым поля.

у вас могут быть пустые поля, если вы укажете другой разделитель полей:

$ ( echo 'this:that:the_other' ; echo 'foo::bar' ) | awk -F: '{print }'
the_other
bar

или, если вы предпочитаете установить разделитель полей в самом скрипте:

$ ( echo 'this:that:the_other' ; echo 'foo::bar' ) | \
    awk 'BEGIN { FS = ":" } {print }'
the_other
bar

но вы можете использовать регулярное выражение в качестве разделителя полей:

$ ( echo 'this that the_other' ; echo 'foo  bar' ) | \
  awk 'BEGIN { FS = "[ ]" } {print }'
the_other
bar

(часть очень старые реализации Awk могут не поддерживать регулярные выражения здесь.)

регулярное выражение "[ ]" не получает то же самое специальное лечение, которое делает космический персонаж.

ссылки на руководство GNU Awk:

разделение полей по умолчанию:

поля обычно разделяются последовательностями пробелов (пробелами, вкладками, и newlines), а не отдельными пробелами. Два пробела подряд не разделите пустое поле. Значение по умолчанию разделителя полей FS is строка, содержащая один пробел, " ". Если awk интерпретировал это значение в обычном таким образом, каждый символ пробела будет разделять поля, поэтому два пробелы в ряду образовывали пустое поле между ними. Причина этого не происходит, так как одно пробел как значение FS - это особый случай -- используется для указания способа разграничения по умолчанию поля.

если FS любой другой одиночный символ, такой как ",", то каждое вхождение что разделяет два поля. Два последовательных вхождений разделите пустое поле. Если характер происходит в начале или конец строки, который тоже ограничивает пустое поле. Пространство символ-это единственный символ, который не следует этим правила.

и использование регулярных выражений для разделения полей.

но будьте осторожны с этим; либо вам придется изменить файл, чтобы использовать другой разделитель, или ваш разбор будет чувствительна к количеству пробелов между полями (foo bar (один бланк) быть отличным от foo bar (С двумя пробелами)).

в зависимости от вашего приложения вы можете рассмотреть разбор строк по номеру столбца, а не по полям, распознанным awk.