包括awk中的函数库

时间:2015-02-11 19:26:19

标签: awk

有很多常见的函数(特别是算术/数学)没有内置到awk中,我需要一直写自己。

例如:

  1. 没有c=min(a,b),所以在awk我经常写c=a<b?a:b
  2. 相同,最大值为c=max(a,b)
  3. 绝对值相同,即c=abs(a)所以我必须经常写c=a>0?a:-a
  4. 依旧......
  5. 理想情况下,我可以将这些函数写入awk源文件,并且&#34;包含&#34;它进入我所有的awk实例,所以我可以随意调用它们。

    我调查了&#34; @ include&#34; GNU gawk的功能,但它只是执行所包含脚本中的任何内容 - 即我无法调用函数。

    我希望在例如一些函数中写一些函数。 mylib.awk,然后&#34;包含&#34;每当我拨打awk时都会这样。

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

5 个答案:

答案 0 :(得分:6)

使用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

答案 1 :(得分:4)

您可以拥有多个-f program-file选项,因此一个可以是您的常用功能,另一个可以是解决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 program-file选项与内联程序混合使用。也就是说,以下不会起作用:

awk -f common_func.awk '{ print trim($1) }' file-to-process.txt # WRONG 

正如评论中所指出的那样,通过gawk,您可以将-f选项与-e一起使用:

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

答案 2 :(得分:3)

如果您无法使用-i(如果您的awk < 4.1版本),EdMorton建议使用GNU Awk 3.1.7

进行下面的尝试
  

- 源程序文本

     

在程序文本中提供程序源代码。此选项允许您将文件中的源代码与您输入的源代码混合在一起   在命令行上。当你有图书馆时,这特别有用   要从命令行程序中使用的函数

$ awk --version
GNU Awk 3.1.7
Copyright (C) 1989, 1991-2009 Free Software Foundation.

$ cat primes.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) }

$ awk -f primes.awk --source 'BEGIN{print min(4,7), abs(-3)}'
4 3

答案 3 :(得分:1)

在常规awk(非gnu)上,您仍然可以使用shell伪造一些文件,将文件的目录放入“代码”中(通常在前面,但是可能无处不在,因为它尊重awk的工作方式订单)

 [Flags]
    public enum TST
    {
        M1 =1,
        M2 =2,
        M3 =4
    }

 public void PseudoCode()
    {

        TST t1 = TST.M1 | TST.M3; //1+2= 3

        switch( t1)
        {
            case TST.M1:
                {
                    //Do work if Bit 1 set
                }
            case TST.M2:
                {
                    //Do work if Bit 2 set
                }
            case TST.M3:
                {
                    //Do work if Bit 3 set
                }
            default:
                {
                    //nothing set;
                    break;
                }
        }

    }

答案 4 :(得分:0)

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