awk-функция не получает вызов, если у меня есть инструкция begin в файле awk

У меня есть awk файл, который загружает другие awk файлы. Вместо того, чтобы вызывать код загрузки каждый раз, когда я запускаю основную функцию файла, я пытаюсь сначала загрузить все в инструкцию BEGIN , но если я это сделаю, сама функция никогда не будет запущена. Есть ли в любом случае инструкция BEGIN и функции, вызываемые извне скрипта?

Мой скрипт awk :

 #! /usr/bin/awk -f function include(includeFile) {INCLUDE_FILES[includeFile]} function sourceIncludes() { if(!l) { getline t < "/proc/self/cmdline"; split(t,T, "\0") scriptname=T[3] for (i = 1; i < ARGC; i++) args=args " "ARGV[i] for(iFile in INCLUDE_FILES ) inc = inc " -f "iFile cmd=sprintf("%s %s -vl=1 -- %s\n",scriptname,inc,args) system(cmd); exit } } function pkginfo(pkg) { { print pkg } } BEGIN { include("wrap.awk") sourceIncludes() } в #! /usr/bin/awk -f function include(includeFile) {INCLUDE_FILES[includeFile]} function sourceIncludes() { if(!l) { getline t < "/proc/self/cmdline"; split(t,T, "\0") scriptname=T[3] for (i = 1; i < ARGC; i++) args=args " "ARGV[i] for(iFile in INCLUDE_FILES ) inc = inc " -f "iFile cmd=sprintf("%s %s -vl=1 -- %s\n",scriptname,inc,args) system(cmd); exit } } function pkginfo(pkg) { { print pkg } } BEGIN { include("wrap.awk") sourceIncludes() } 

wrap.awk содержание:

 #! /usr/bin/awk -f function wrap(text, q, y, z) { while(text) { q = match(text, / |$/) y += q if(y >= 80) { z = z RS sprintf("%c", 0x2502) #chr(2502)#"\\u2502" for(i = 0; i < 20; i++) z = z FS y = q - 1 } else if(z) z = z FS z = z substr(text, 1, q - 1) text = substr(text, q + 1) } return z } в #! /usr/bin/awk -f function wrap(text, q, y, z) { while(text) { q = match(text, / |$/) y += q if(y >= 80) { z = z RS sprintf("%c", 0x2502) #chr(2502)#"\\u2502" for(i = 0; i < 20; i++) z = z FS y = q - 1 } else if(z) z = z FS z = z substr(text, 1, q - 1) text = substr(text, q + 1) } return z } 

Так я называю все из bash / zsh:

 awk -f ~/.ZSH_CUSTOM/awkscripts/pkginfo.awk -e '{ pkginfo("test") }' 

One Solution collect form web for “awk-функция не получает вызов, если у меня есть инструкция begin в файле awk”

Вы вызываете exit из BEGIN{} , это означает, что все, что не было в более раннем BEGIN{} или END{} , не будет выполнено.

Даже без выхода, ваш код

 { pkginfo("test") } 

не будет выполняться до тех пор, пока не будет доступна строка ввода (stdin), так будет работать awk. Вы можете обойти это, вызвав функцию с кодом ( main() например) с вашим кодом, а затем exit в конец последнего блока BEGIN .

awk – довольно общая цель, но он действительно хочет читать строки ввода и сопоставлять их с шаблонами. Вот почему ваш код, кажется, висит.

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

 BEGIN { pkginfo("test") } 

хотя вам может понадобиться понять порядок всех блоков BEGIN . Или, если вы вызываете exit в конце окончательного BEGIN вы можете поместить свой код в блок END{} . При наличии блоков BEGIN / END никаких ожиданий не ожидается.

Поскольку вы работаете в Linux-системе, вы, скорее всего, используете gawk а не простой awk ( nawk , mawk или аналогичный), почти наверняка я думаю, что с -e также является расширением gawk версии 4 😉 В этом случае вы можете использовать @include который устраняет некоторый код. В противном случае для любого другого скрипта-оболочки awk igawk кажется более чистым способом обеспечения возможности включения.

  • файлы списка tar, перерыв в первом файле
  • разделить файл на две части, по шаблону
  • Перечислять дубликаты имен файлов в листинге?
  • файл шаблона в качестве входа в RS, FS в awk / sed / grep для распознавания и добавления столбцов
  • Эквивалент grep для awk или sed
  • Слияние и добавление таблиц для создания главной таблицы из нескольких таблиц
  • извлекать поля из «хвоста -f» потока syslog
  • Awk - сопоставление по 2 столбцам для разных строк
  • awk-манипуляция файлом fasta
  • awk синтаксическая ошибка неожиданная новая строка или конец строки
  • Вставить несколько файлов на основе первого столбца в один файл
  • Как обрабатывать текстовый файл с несколькими столбцами для получения другого текстового файла с несколькими столбцами?
  • Interesting Posts

    Как установить keepass2 на CentOS 7?

    «Нет больше PTY» при запуске экрана в качестве пользователя без root

    В чем разница между встроенной командой echo и / bin / echo?

    Ошибка пустого экрана VirtualBox Centos

    Как сохранить содержимое файла вместо добавления к нему

    Как изменить действие прокрутки в GNOME 3.10

    Что означает точка в регулярном выражении «^ {2} {2}. *" Делать?

    Удаление строк из одного файла на основе небытия в другом

    Если каталог является файлом, могу ли я увидеть содержимое этого файла?

    Как определить, какие инструкции выполняет процесс?

    Исправить проблему с файловой системой «только для чтения» при доступе SSH к IP-камере

    Как копировать / вставлять данные в буфер обмена Windows и из буфера обмена Windows в буфер обмена OpenSuse с помощью VNC?

    Скрыть всплывающее окно xfoil

    Установщик Oracle Server не позволяет ввести значение в поле

    Создание раздела из каталога

    Linux и Unix - лучшая ОС в мире.