有许多常见的功能(特别是算术/数学)没有内置awk,我需要一直写自己.
例如:
c=min(a,b) ,所以在awk我经常写c=a<b?a:bc=max(a,b)c=abs(a) 所以我必须不断写c=a>0?a:-a理想情况下,我可以将这些函数写入awk源文件,并将其"包含"到我的所有awk实例中,这样我就可以随意调用它们.
我查看了GNU的"@include"功能gawk,但它只执行包含脚本中的任何内容 - 即我无法调用函数.
我希望在例如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
Run Code Online (Sandbox Code Playgroud)
您可以有多个-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)
| 归档时间: |
|
| 查看次数: |
2391 次 |
| 最近记录: |