包括awk中的函数库

cmo*_*cmo 5 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. 等等....

理想情况下,我可以将这些函数写入awk源文件,并将其"包含"到我的所有awk实例中,这样我就可以随意调用它们.

我查看了GNU的"@include"功能gawk,但它只执行包含脚本中的任何内容 - 即我无法调用函数.

我希望在例如mylib.awk,写一些函数 ,然后每当我打电话时"包括"这个awk.

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

Ed *_*ton 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
Run Code Online (Sandbox Code Playgroud)


jas*_*jas 6

您可以有多个-f program-file选项,因此一个可以是您的常用函数,另一个可以是解决特定问题的 awk 脚本,它可以访问这些函数。

awk -f common-funcs.awk -f specific.awk file-to-process.txt
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是你要找的,但这是我想出的最好的。下面是一个例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

使用常规 awk(非 gnu),您不能将该-f program-file选项与内联程序混合使用。也就是说,以下操作不起作用:

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

但是,正如评论中指出的那样,使用 gawk 您可以将该-f选项与-e以下选项一起使用:

awk -f file.awk -e '{stuff}' file.txt
Run Code Online (Sandbox Code Playgroud)

  • 只需将内联程序放在其他“-f”文件后面,它就可以与“mawk”和“nawk”(可能还有所有“awk”)一起使用 :::::::::::: :::: :: ::: :::::: :::::: ::::::::: :::::::::::: :::::::::::: : :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :: :::: `mawk -f common_func.awk -f &lt;( printf '%s' '{ print trim($0) }' )` (3认同)