动态构建命令并在AWK中执行它[关闭]

问题描述 投票:0回答:1

我有一个日志文件,每天都会处理它(通过使用 awk 脚本,称为 main.awk)并提取一些字符,然后我将该进程的输出写入新文件,其他团队成员可以在其中使用它。

另一方面,我有另一个文件(我称之为

input.txt
),其中有一千多行,每行有一个12个字符的字符串。 我想使用
input.txt
的前 8 个字符作为我的
main.awk
中的函数之一的输入。

main.awk
在这里:

   #!/usr/local/bin/gawk -f
    
    @include "home/user/functions.awk"
    {
    
            STRType=substr($0,27+23,2);
            TYPEOUT=substr($0,28,3);
    
            if(STRType == "O1")
            {
    
                    filterTxtforfunc($0,"PRH1DCHK");
    
            }
    
        else
        if(STRType=="H6")
            {
                    print substr($0,28)
                    fflush()
            }
    
        else
        if(STRType=="J7" && TYPEOUT=="000")
            {
                    print substr($0,28)
                    fflush()
            }
    
    
    }

我检查过类似的主题,但它们对我没有帮助。我没有可能使用Python、Jason以及除了shell脚本之外的其他语言和库。我用bash脚本编写了它,但现在我需要使用

getline
,因为不可能在awk文件中使用bash脚本。

以前,我编写了 bash 脚本只是为了测试,它可以按照我想要的方式工作(但我不能在 main.awk 中使用它。我来这里只是为了清理。):

filterTxtforfunc() {
   echo does something
}
input_file="input.txt"
while IFS= read -r line; do
   # Extract the first 8 characters from the line
   code="${line:0:8}"
   # Dynamically build the command and execute it
   filterTxtforfunc "$0" "$code"
done < "$input_file"

我用过但不起作用的是:

BEGIN {
    input_file="input.txt"
    while ( (input_file | getline line) > 0 ) {
        ARGV[ARGC++] = line
    }
    close(input_file)
}

input.txt是这样的:

WRM3BHIZ0004
NRB1SAPB0122
LRT1SYGM0114
KRF1LAEI0451
JRU1TEEE0764
ZRQ1LQWS0666
PRH1DCHK0904
...
shell awk getline
1个回答
0
投票

也许是这样的:

awk '
    # ...
    function processfile (file,        e,line,code) {
        for (;;) {
            e = getline line <file
            if (e<0) exit 1
            if (e==0) break

            code = substr(line,1,8)
            processline(line,code)
        }
        close(file)
    }
    # ...
'

定义

processline
函数。使用包含要处理的文件名称的字符串调用
processfile

© www.soinside.com 2019 - 2024. All rights reserved.