在awk中包含函数库

在awk中包含函数库,awk,Awk,有许多常用函数(特别是算术/数学)不是内置在awk中,我需要一直自己编写 例如: 没有c=min(a,b),所以在awk中,我不断地写c=a0?a:-a 等等 理想情况下,我可以将这些函数写入awk源文件,并将其“包含”到我的所有awk实例中,这样我就可以随意调用它们 我研究了GNU的gawk的“@include”功能,但它只执行包含脚本中的任何内容,即我无法调用函数 awk -f common-funcs.awk -f specific.awk file-to-process.txt 我希望

有许多常用函数(特别是算术/数学)不是内置在
awk
中,我需要一直自己编写

例如:

  • 没有
    c=min(a,b)
    ,所以在
    awk
    中,我不断地写
    c=a0?a:-a
  • 等等
  • 理想情况下,我可以将这些函数写入
    awk
    源文件,并将其“包含”到我的所有awk实例中,这样我就可以随意调用它们

    我研究了GNU的
    gawk
    的“@include”功能,但它只执行包含脚本中的任何内容,即我无法调用函数

    awk -f common-funcs.awk -f specific.awk file-to-process.txt
    
    我希望用mylib.awk编写一些函数,然后在调用
    awk
    时“包含”这些函数

    我尝试了
    -f mylib.awk
    选项以
    awk
    ,但脚本已执行-其中的函数不可调用。

    使用GNU awk:

    $ ls lib
    prims.awk
    
    $ cat lib/prims.awk
    function abs(num) { return (num > 0 ? num : -num) }
    function max(a,b) { return (a > b ? a : b) }
    function min(a,b) { return (a < b ? a : b) }
    
    $ export AWKPATH="$PWD/lib"
    
    $ awk -i prims.awk 'BEGIN{print min(4,7), abs(-3)}'
    4 3
    
    $ cat tst.awk
    @include "prims.awk"
    BEGIN { print min(4,7), abs(-3) }
    
    $ awk -f tst.awk
    4 3
    
    $ls lib
    普里姆斯·奥克
    $cat lib/prims.awk
    函数abs(num){return(num>0?num:-num)}
    函数max(a,b){返回(a>b?a:b)}
    函数min(a,b){返回(a
    您可以有多个
    -f程序文件
    选项,因此一个可以是您的常用函数,另一个可以是特定的问题解决awk脚本,该脚本将访问这些函数

    awk -f common-funcs.awk -f specific.awk file-to-process.txt
    
    我不知道这是否是你想要的,但这是我想到的最好的。下面是一个例子:

    $ cat common_func.awk
    # Remove spaces from front and back of string
    function trim(s) {
      gsub(/^[ \t]+/, "", s);
      gsub(/[ \t]+$/, "", s);
      return s;
    }
    
    $ cat specific.awk
    { print $1, $2 }
    { print trim($1), trim($2) }
    
    $ cat file-to-process.txt 
    abc    |    def   |
    
    2$ awk -F\| -f common_func.awk -f specific.awk file-to-process.txt 
    abc         def   
    abc def
    
    对于常规awk(非gnu),您不能将
    -f程序文件
    选项与内联程序混合使用。也就是说,以下操作不起作用:

    awk -f common_func.awk '{ print trim($1) }' file-to-process.txt # WRONG 
    
    但是,正如评论中指出的,使用gawk时,您可以将
    -f
    选项与
    -e
    一起使用:

    awk -f file.awk -e '{stuff}' file.txt
    

    如果EdMorton建议您不能使用
    -i
    (如果您的
    awk<4.1
    版本),请尝试使用
    GNU awk 3.1.7

    --源程序文本

    在程序文本中提供程序源代码。此选项允许您将文件中的源代码与输入的源代码混合使用 在命令行上。当您拥有库时,这尤其有用 要从命令行程序中使用的函数

    $awk--版本
    GNU Awk 3.1.7
    版权所有(C)1989,1991—2009自由软件基金会。
    $cat primes.awk
    函数abs(num){return(num>0?num:-num)}
    函数max(a,b){返回(a>b?a:b)}
    函数min(a,b){返回(a
    在常规awk(非gnu)上,您仍然可以使用shell在“代码”中使用cat文件(通常在前面,但可能无处不在,因为它尊重awk的工作顺序)


    使用GNU awk,您可以使用-i命令行选项,也可以从脚本内部使用@include指令,但如果您想要POSIX解决方案,则需要使用awk-f functions.awk-f script.awk file.txt。

    不起作用。当您不使用gawk或使用旧版本并需要获得新版本时,“-i”选项显然未被识别(
    -i
    在gawk 4.1中引入)。你说的
    awk-f lib.awk-f script.awk
    对你不起作用,或者让我觉得你没有使用gawk,或者你的文件内容不是你想要的。很好,升级解决了这个问题。我(再一次)被我的集群上的一些软件的使用年限震惊了。我相信将这段代码放在您的配置文件中是一个有趣的解决方案:
    export AWKPATH=“/path/to/awk/lib”;别名primsawk=“awk-i$AWKPATH/prims.awk”
    您不需要在awk调用中指定AWKPATH,它只需
    awk-i prims.awk
    > cat /tmp/delme.awk
       function PrintIt( a) { printf( "#%s\n", a )}
    
    > echo "aze\nqsd" | awk "$( cat /tmp/delme.awk)"'{ sub( /./, ""); PrintIt( $0 )}'
    #ze
    #sd