função awk não sendo chamada se eu tiver uma instrução begin no arquivo awk

1

Eu tenho um arquivo awk que carrega outros arquivos awk . Em vez de chamar o código de carregamento toda vez que eu executo a função principal do arquivo, estou tentando carregar tudo em uma instrução BEGIN primeiro, mas se eu fizer isso, a própria função nunca será executada. Existe alguma maneira de ter uma instrução BEGIN e funções chamadas de fora do script?

Meu script awk :

#! /usr/bin/awk -f

function include(includeFile) {INCLUDE_FILES[includeFile]}
function sourceIncludes()
{
    if(!l)
    {
        getline t < "/proc/self/cmdline"; split(t,T, "
#! /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
}
") 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 -v l=1 -- %s\n",scriptname,inc,args) system(cmd); exit } } function pkginfo(pkg) { { print pkg } } BEGIN { include("wrap.awk") sourceIncludes() }

conteúdo do wrap.awk:

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

É assim que eu chamo tudo de bash / zsh:

#! /usr/bin/awk -f

function include(includeFile) {INCLUDE_FILES[includeFile]}
function sourceIncludes()
{
    if(!l)
    {
        getline t < "/proc/self/cmdline"; split(t,T, "
#! /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
}
") 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 -v l=1 -- %s\n",scriptname,inc,args) system(cmd); exit } } function pkginfo(pkg) { { print pkg } } BEGIN { include("wrap.awk") sourceIncludes() }
    
por ZeroPhase 28.07.2017 / 06:54

1 resposta

0

Você está chamando exit de BEGIN{} , isso significa que qualquer coisa que não esteja em um BEGIN{} ou END{} anterior não será executada.

Mesmo sem a saída, seu código

{ pkginfo("test") }

não será executado até que uma linha de entrada (stdin) esteja disponível, é assim que o awk funciona. Você poderia contornar isso chamando uma função com seu código ( main() , por exemplo) com seu código e, em seguida, exit no final do último bloco BEGIN .

awk é um propósito bastante geral, mas realmente quer ler linhas de entrada e combiná-las com padrões. É por isso que seu código parece travar,.

Ou você pode usar

BEGIN { pkginfo("test") }

embora você possa precisar entender a ordem de todos os blocos BEGIN . Ou, se você chamar exit no final do% finalBEGIN, poderá colocar seu código em um bloco END{} . Nenhuma entrada será esperada se você tiver apenas BEGIN / END blocks.

Como você está rodando em um sistema Linux, é bem provável que esteja usando gawk em vez de um awk ( nawk , mawk ou similar), quase certamente porque -e também é gawk versão 4 extensão ;-) Nesse caso, você pode usar @include , o que elimina algum código. Caso contrário, para qualquer outro awk thes script wrapper igawk parece um caminho mais limpo para realizar incluem capacidade.

    
por 07.10.2017 / 21:11

Tags