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

  • Согласование 2 основных столбцов между файлами; и вставьте другие столбцы в выходной файл, когда совпадают эти основные столбцы. Сохраняйте размер строки 1-го файла
  • как добавить калькулятор командной строки в bash, который использует запятую как десятичную метку?
  • Как я могу получить доступ к столбцу строки из строки?
  • Как использовать awk через несколько файлов?
  • Как проверить, отсутствует ли какой-либо повторяющийся текст в текстовом файле?
  • Импульсные данные по мажоритарной стоимости на группу
  • Unix awk, функция флага, многократное условие if
  • 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 кажется более чистым способом обеспечения возможности включения.

    Interesting Posts

    Лучшая практика для установки времени в локальной сети с использованием NTP

    Как я запрещаю Ubuntu писать AnyYING на внешний жесткий диск?

    SSH-туннель через посреднический сервер – как подключиться в один шаг (используя пару ключей)?

    zsh отказывается принять новый сценарий автозаполнения

    ZSH% m prompt escape не работает, как описано в Debian Linux

    Почему «nohup» и «disout» не работают на SoX (вызывается как «игра»)

    Вам нужно нажать enter, чтобы получить приглашение после выполнения скрипта udev

    Найти и установить пакеты Mint по умолчанию в новую установку Ubuntu

    Ошибка синхронизации времени выполнения ec2 экземпляра с помощью ssh

    Переадресация X11, но открытые ссылки локально

    расширять псевдонимы перед вызовом / usr / bin / time

    Как я могу изменить название продукта процессора?

    Маршрутизация частной сети в Интернет через 2 шлюза

    Создание сценария оболочки внутри текстового редактора

    Может ли Yum выражать предпочтение x86_64 по пакетам i386?

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