AWK для l oop идет вечно без НАЧАЛА - PullRequest
1 голос
/ 26 апреля 2020

Без НАЧАЛА для l oop в AWK продолжается навсегда после печати чисел на основе условия -

С НАЧАТЬ, как только значение i будет равно 5, l oop заканчивается

$ awk 'awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
1
2
3
4
5

Без BEGIN -

$ awk '{ for (i = 1; i <= 5; ++i) print i }'
 -> Press enter here for output
1
2
3
4
5
-> Press enter again and printed numbers again .
1
2
3
4
5

1
2
3
4
5
^C -> control C to come out of loop

Хотя я понимаю, что блок BEGIN будет выполняться один раз в начале программы, но без начала, как только будут выполнены критерии выхода, не должна ли команда выходить?

Пожалуйста, помогите понять, что здесь происходит.

Спасибо!

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Вы задаете неправильный вопрос.

Следует ожидать поведения в вашем втором эксперименте. Вы не указали имя файла (или имена) в командной строке, поэтому awk читает стандартный ввод. Он читает по одной строке за раз, пока не достигнет конца файла (как это было бы при чтении из реального файла). И он выполняет правила, которые вы указали для каждой строки; пустые строки не имеют значения. Тогда: ctrl-C - нецивилизованный способ прекратить программу грубой силой; правильный способ - выдать ctrl-D, отмечая конец «файла» и позволяя awk нормально завершиться.

Обратите внимание на путаницу в вашем вопросе между «выходом из l oop» "и" завершение программы ". L oop заканчивается, когда выполняется условие выхода, затем awk переходит к следующей строке ввода. В общих чертах, выход из al oop, который является частью правил программы, не имеет никакого отношения к завершению самой программы awk.

"Неожиданное" поведение в вашем first эксперимент. Там тоже awk читает со стандартного ввода; почему он не ждет EOF (ctrl-D) перед выходом, хотя думал, что правила BEGIN будут выполняться только один раз?

Ответ - «потому что это заданное поведение». Например: https://www.gnu.org/software/gawk/manual/html_node/Using-BEGIN_002fEND.html

Если в программе awk есть только правила BEGIN и других правил нет, то программа завершается после выполнения правил BEGIN .

Вам также может понравиться чтение сноски:

Оригинальная версия awk продолжала читать и игнорировать ввод, пока не был замечен конец файла.

Я бы сказал, что «оригинальная версия» делала «правильные вещи», но это, вероятно, смущало слишком многих пользователей, поэтому поведение было изменено.

По крайней мере, это GNU "указанное поведение"; Я не знаю, что говорит стандарт POSIX.

1 голос
/ 26 апреля 2020

l oop действительно завершается, но l oop выполняется один раз для каждой строки ввода, пока не будет достигнут конец ввода. Попробуйте ввести control-D вместо control- C при вводе ввода, чтобы обеспечить эту индикацию EOF. Измените print i на print NR, i и добавьте оператор END{print "Done!"} в ваш скрипт, чтобы увидеть, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...