有很多常见的函数(特别是算术/数学)没有内置到awk
中,我需要一直写自己。
例如:
c=min(a,b)
,所以在awk
我经常写c=a<b?a:b
c=max(a,b)
c=abs(a)
所以我必须经常写c=a>0?a:-a
理想情况下,我可以将这些函数写入awk
源文件,并且&#34;包含&#34;它进入我所有的awk实例,所以我可以随意调用它们。
我调查了&#34; @ include&#34; GNU gawk
的功能,但它只是执行所包含脚本中的任何内容 - 即我无法调用函数。
我希望在例如一些函数中写一些函数。 mylib.awk
,然后&#34;包含&#34;每当我拨打awk
时都会这样。
我尝试-f mylib.awk
选项awk
,但脚本已执行 - 其中的函数无法调用。
答案 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。你需要走。