Разделитель между операторами в awk

От подчеркиваний по умолчанию у меня болят глаза. Эта настройка значительно улучшает чтение страниц man:

Coloured man page example

Добавьте следующее в ваш `~.bashrc':

# Have less display colours
# from: https://wiki.archlinux.org/index.php/Color_output_in_console#man
export LESS_TERMCAP_mb=$'\e[1;31m'     # begin bold
export LESS_TERMCAP_md=$'\e[1;33m'     # begin blink
export LESS_TERMCAP_so=$'\e[01;44;37m' # begin reverse video
export LESS_TERMCAP_us=$'\e[01;37m'    # begin underline
export LESS_TERMCAP_me=$'\e[0m'        # reset bold/blink
export LESS_TERMCAP_se=$'\e[0m'        # reset reverse video
export LESS_TERMCAP_ue=$'\e[0m'        # reset underline
export GROFF_NO_SGR=1                  # for konsole and gnome-terminal

Для победы, сочетайте с export MANPAGER='less -s -M +Gg' (source) для отображения вашего процента в документе.

7
17.07.2017, 22:21
3 ответа

Очень хороший вопрос! Я думаю, ключ вот в чем:«Таким образом, программа, показанная в начале этого раздела , могла бы быть написана таким же образом :»

Не обязательно писать таким образом. Это своего рода альтернативный способ. Это означает (и было доказано в действии ), что оба приведенных ниже утверждения верны:

$ awk '/12/ { print $0 } /21/ { print $0 }' file
$ awk '/12/ { print $0 } ; /21/ { print $0 }' file

Я думаю, что эта точка с запятой предназначена для очень короткого -идиоматического кода, например, в случаях, когда мы опускаем часть действия и хотим применить несколько правил в одной строке:

$ awk '/12//21/' file
awk: cmd. line:2: /12//21/
awk: cmd. line:2:         ^ unexpected newline or end of string

В этом случае использование точки с запятой обязательно для разделения правил (=условия):

$ awk '/12/;/21/' file

Поскольку часть {action}опущена в обоих правилах/оба условиях, действие по умолчанию будет выполняться для каждого правила ={print $0}

12
27.01.2020, 20:14

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

$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" } /bar/ {print "bar found"}'
foo found
bar found
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" }; /bar/ {print "bar found"}'
foo found
bar found
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found"; print "whee" }'
foo found
whee
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" print "whee" }'
gawk: cmd. line:1: /foo/ { print "foo found" print "whee" }
gawk: cmd. line:1:                           ^ syntax error

Однако, когда фактический блок кода между двумя условными операторами опущен в пользу стандартного (i. е. {print}),точка с запятой становится необходимой:

$ echo -e "foo\nbar" | gawk '/foo/ /bar/'
gawk: cmd. line:2: /foo/ /bar/
gawk: cmd. line:2:            ^ unexpected newline or end of string
$ echo -e "foo\nbar" | gawk '/foo/; /bar/'
foo
bar
3
27.01.2020, 20:14

В gawk эти две цитаты из руководства описывают проблему:

An action consists of one or more awk statements, enclosed in braces (‘{…}’). Each statement specifies one thing to do. The statements are separated by newlines or semicolons.

Точка с запятой является " разделителем ", но не " терминатором ".
Единственным допустимым терминатором действия является закрывающая фигурная скобка(}).

Следовательно, то, что следует за закрывающей скобкой действия (}), должно быть другим шаблоном {действие}

В "man mawk " есть другое описание, которое может помочь прояснить, что должен делать awk:

Statements are terminated by newlines, semi-colons or both. Groups of statements such as actions or loop bodies are blocked via {... } as in C. The last statement in a block doesn't need a terminator.

«Человек наук » объясняет это так:

The pattern comes first, and then the action. Action statements are enclosed in { and }.

И, если вы хотите остановиться на деталях, прочтите описание POSIX:

action           : '{' newline_opt                             '}'
                 | '{' newline_opt terminated_statement_list   '}'
                 | '{' newline_opt unterminated_statement_list '}'
                 ;

И найдите то, что является «незавершенным» списком операторов.

Или, проще, найдите Действие , чтобы прочитать:

Any single statement can be replaced by a statement list enclosed in curly braces. The application shall ensure that statements in a statement list are separated by <newline> or <semicolon> characters.

Снова:are separated by <newline> or <semicolon> characters

6
27.01.2020, 20:14

Теги

Похожие вопросы