Как я могу исключить пустые строки с помощью awk?

Вопрос

Как я могу исключить строки, начинающиеся с пробела, и в которых больше ничего нет? С помощью awk я хочу напечатать строку Need to print, но она также печатает пустую строку. Как я могу это исключить?

Скрипт: test.awk

$0 !~/^start|^#/ {
print "Result : %s",$0
}

Данные

# test

start
Need to print

Результат

Result : %s 
Result : %s Need to print

person Sigularity    schedule 18.02.2016    source источник
comment
Два ответа, которые у вас есть, будут вести себя по-разному, когда строка содержит только пустые символы - какое решение вам нужно, зависит от того, следует ли считать такую ​​строку пустой строкой или нет для ваших целей.   -  person Ed Morton    schedule 18.02.2016


Ответы (2)


Используйте переменную NF

На самом деле вы не спрашиваете о строках, начинающихся с пробела, вы спрашиваете о том, как отбрасывать пустые строки. С практической точки зрения пустые строки не имеют полей, поэтому вы можете использовать встроенную переменную NF, чтобы отбрасывать строки, в которых нет хотя бы одного поля. Например:

$ awk 'NF > 0 && !/^(start|#)/ {print "Result: " $0}' /tmp/corpus 
Result: Need to print
person Todd A. Jacobs    schedule 18.02.2016
comment
NF > 0 можно заменить на NF. - person karakfa; 18.02.2016
comment
@karakfa Возможно, поскольку он работает с BSD и GNU awk. Однако я не уверен, насколько это переносимо для всех awks. Даже если он на 100% портативный, краткость никогда не важнее ясности намерений. Я всегда предпочитаю, чтобы мой код был четким в отношении сравнений, а не использовал неявные сравнения, о которых будущим читателям будет трудно рассуждать. YMMV. Тем не менее, спасибо за подсказку! - person Todd A. Jacobs; 19.02.2016
comment
В принципе я согласен, но awk 'NF' идиоматично awk для печати непустых строк. - person karakfa; 19.02.2016

Вы можете использовать:

awk '/^[^[:space:]]/{print "Result : " $0}'

Использование [^[:space:]] гарантирует, что в каждой строке, которая будет напечатана, есть хотя бы один непробельный символ.

person hek2mgl    schedule 18.02.2016
comment
Начальный ^ в /^[^[:space:]]/ означает, что будут пропущены все строки с отступом, отличным от пробела. Это не на 100% ясно из вопроса, так как образец не включал этот случай, но обычно это не то, что люди имеют в виду, когда говорят, что хотят exclude lines starting with a space character, and that have nothing else on the line. - person Ed Morton; 18.02.2016