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") }' 

  • Вставка текста из встроенного файла после сопоставления шаблона в другом файле
  • объединить файлы csv, сохранить запятую внутри кавычек
  • Использовать awk для печати и редактирования даты
  • Grep / awk / sed для строк, состоящих только из двух букв, и строк, начинающихся с буквы и встречающих определенную длину
  • awk: установить желаемое количество столбцов?
  • Одиночная запись файла, разбитого на несколько строк
  • echo $ вместе с переменной
  • awk + как выполнить ИЛИ в awk
  • 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 кажется более чистым способом обеспечения возможности включения.

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