在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