Сохраняет ли поведение AWK END загруженную последнюю строку в $ 0 на странице руководства?

Вы можете (временно) назначить пользователю права на запись в этот файл, например sudo chown youruseraccount /usr/local/MATLAB/R2016a/toolbox/local/pathdef.m, а затем выполните установку и снова измените разрешения. Но это не сработает, если у вас нет на это привилегий. Другой вариант - изменить вызов savepath для записи пользовательского pathdef.m :

$ cd
$ matlab
...
>> mkdir wfdb
>> cd wfdb
>> [old_path]=which('rdsamp');if(~isempty(old_path)) rmpath(old_path(1:end-8)); end
...
>> savepath ~/pathdef.m
>> exit
...
$ matlab
...
>> wfdb

Предполагается, что ваш домашний каталог - это ваша папка запуска для Matlab, хотя pathdef .m можно было сохранить в какой-либо другой каталог, и Matlab запускался из этого каталога, или исходный путь к папке был изменен в настройках Matlab.

4
13.04.2017, 15:36
2 ответа

Блок BEGIN запускается до обработки любого ввода, поэтому $ 0 еще не инициализирован.

Блок END ничего не делает с $ 0 , который сохраняет свое последнее значение. В вашем сценарии AWK это только последняя прочитанная строка, потому что AWK считывает все свои входные данные построчно, выполняет свою обычную обработку разделения полей (присваивая $ 0 и так далее), но никогда не находит соответствующий блок; но, например,

seq 42 | awk '{ $0 = "21" } END { print }'

выводит 21, а не 42, поэтому это не тот случай, когда «при запуске блока END последняя строка загружается в $ 0 ».

Это не описано в справочной странице gawk (1) , но описано в mawk (1) (очевидно, для этой реализации AWK):

Аналогично , при входе в действия END , $ 0 , поля и NF имеют свое значение, не измененное по сравнению с последней записью.

В руководстве GNU AWK упоминается такое поведение :

Фактически, все BWK awk , mawk и gawk ] сохранить значение $ 0 для использования в правилах END .

«BWK awk » - это awk Брайана Кернигана, «один истинный awk » ; он реализовал это поведение в 2005 году, как описано в его файле FIXES :

24 апреля 2005 г .: изменен lib.c , так что значения $ 0 и др. сохраняются в END block, по-видимому, как того требует posix. благодаря Хаварду Эйднесу для отчета и кода.

Это изменение видно в «одной истинной awk » истории . Последний выпуск BWK awk ведет себя так же, как GNU AWK:

$ echo three fields here | ./awk '{ $0 = "one" } END { print $0 " " NF }'
one 1
$ echo three fields here | ./awk 'END { $0 = "one"; print $0 " " NF }'
one 1
9
27.01.2020, 20:46

Согласно руководству GNU awk, немного неясно, что $0 должно содержаться в правиле END. POSIX требует, чтобы NF "сохранял [свое] значение" (*), но не упоминает $0.

Вероятнее всего, по недосмотру в стандарте не сказано, что $0 также сохраняется, хотя по логике можно было бы подумать, что так и должно быть. Фактически, все BWK awk, mawk и gawk сохраняют значение $0 для использования в правилах END. Имейте в виду, однако, что некоторые другие реализации и многие старые версии Unix awk этого не делают.

В некотором смысле я нахожу такое поведение логичным. Оставив $0 для блока END, можно легко получить доступ к последней записи, если это необходимо. К первой записи легко получить доступ с помощью NR == 1 {...}, поэтому специальное ключевое слово не требуется. С другой стороны, выполнение блоков BEGIN перед загрузкой первой записи позволяет установить FS или RS вовремя, чтобы они стали активными для первой записи.

(* Что бы это ни значило, см. комментарии.)

4
27.01.2020, 20:46

Теги

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