result = atan2 (y,x) * 180 / PI;
printf "The arc tangent for (x=%f, y=%f) is %f degrees\n", x, y, result
输出结果为:
The arc tangent for (x=-10.000000, y=10.000000) is 135.000000 degrees
result = cos(param * PI / 180.0);
printf "The cosine of %f degrees is %f.\n", param, result
输出结果为:
The cosine of 60.000000 degrees is 0.500000.
print "Random num1 =" , rand()
print "Random num2 =" , rand()
print "Random num3 =" , rand()
输出结果为:
Random num1 = 0.237788
Random num2 = 0.291066
Random num3 = 0.845814
gsub( Ere, Repl, [ In ] )
gsub 是全局替换( global substitution )的缩写。除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行。
$ awk 'BEGIN {
str = "Hello, World"
print "String before replacement = " str
gsub("World", "Jerry", str)
print "String after replacement = " str
输出结果为:
String before replacement = Hello, World
String after replacement = Hello, Jerry
substr(str, start, l)
substr 函数返回 str 字符串中从第 start 个字符开始长度为 l 的子串。如果没有指定 l 的值,返回 str 从第 start 个字符开始的后缀子串。
$ awk 'BEGIN {
str = "Hello, World !!!"
subs = substr(str, 1, 5)
print "Substring = " subs
输出结果为:
Substring = Hello
index( String1, String2 )
在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。
$ awk 'BEGIN {
str = "One Two Three"
subs = "Two"
ret = index(str, subs)
printf "Substring \"%s\" found at %d location.\n", subs, ret
输出结果为:
Substring "Two" found at 5 location.
substr( String, M, [ N ] )
返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。
$ awk 'BEGIN {
str = "Hello, World !!!"
subs = substr(str, 1, 5)
print "Substring = " subs
输出结果为:
Substring = Hello
match( String, Ere )
在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。
$ awk 'BEGIN {
str = "One Two Three"
subs = "Two"
ret = match(str, subs)
printf "Substring \"%s\" found at %d location.\n", subs, ret
输出结果为:
Substring "Two" found at 5 location.
split( String, A, [Ere] )
将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。
$ awk 'BEGIN {
str = "One,Two,Three,Four"
split(str, arr, ",")
print "Array contains following values"
for (i in arr) {
print arr[i]
输出结果为:
Array contains following values
Three
sprintf(Format, Expr, Expr, . . . )
根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。
$ awk 'BEGIN {
str = sprintf("%s", "Hello, World !!!")
print str
输出结果为:
Hello, World !!!
strtonum(str)
strtonum 将字符串 str 转换为数值。 如果字符串以 0 开始,则将其当作八进制数;如果字符串以 0x 或 0X 开始,则将其当作十六进制数;否则,将其当作浮点数。
$ awk 'BEGIN {
print "十进制数 = " strtonum("123")
print "八进制数 = " strtonum("0123")
print "十六进制数 = " strtonum("0x123")
输出结果为:
十进制数 = 123
八进制数 = 83
十六进制数 = 291
1、gsub、sub 使用
$ awk 'BEGIN{info="this is a test2012test!";gsub(/[0-9]+/,"||",info);print info}'
this is a test||test!
2、查找字符串(index 使用)
使用了三元运算符:
表达式 ? 动作1 : 动作2
$ awk 'BEGIN{info="this is a test2012test!";print index(info,"11111")?"ok":"no found";}'
no found
$ awk 'BEGIN{info="this is a test2012test!";print index(info,"is")?"ok":"no found";}'
$ awk 'BEGIN{info="this is a test2012test!";print index(info,"test")?"ok":"no found";}'
3、正则表达式匹配查找(match 使用)
$ awk 'BEGIN{info="this is a test2012test!";print match(info,/[0-9]+/)?"ok":"no found";}'
4、截取字符串(substr使用)
从第 4 个 字符开始,截取 10 个长度字符串。
$ awk 'BEGIN{info="this is a test2012test!";print substr(info,4,10);}'
s is a tes
5、字符串分割(split使用)
$ awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
4 test
1 this
分割 info,将 info 字符串使用空格切分为动态数组 tA。注意 awk for …in 循环,是一个无序的循环。 并不是从数组下标 1…n ,因此使用时候需要特别注意。
6、格式化字符串输出(sprintf使用)
其中格式化字符串包括两部分内容: 一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符, 以 % 开始, 后跟一个或几个规定字符,用来确定输出内容格式。 需要特别注意的是使用 printf 时默认是不会换行的,而 print 函数默认会在每行后面加上 \n 换行符。
$ awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}'
124.11,4294967295,1.2,7C,174
$ awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2645; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}'
124.11,4294967295,1.3,7C,174
注:看上面的 n3 输出值会发现,在使用 printf 处理时一个比较智能的功能是可以进行四舍五入保留小数点位的。
$ awk 'BEGIN {
print "Number of seconds since the Epoch = " mktime("2014 12 14 30 20 10")
输出结果为:
Number of seconds since the Epoch = 1418604610
ISO8610 标准周所在的年份模除 100(00-99)。比如,1993 年 1 月 1 日属于 1992 年的第 53 周。所以,虽然它是 1993 年第 1 天,但是其 ISO8601 标准周所在年份却是 1992。同样,尽管 1973 年 12 月 31 日属于 1973 年但是它却属于 1994 年的第一周。所以 1973 年 12 月 31 日的 ISO8610 标准周所在的年是 1974 而不是 1973。
ISO 标准周所在年份的全称。
等价于 %b.
用十进制表示的 24 小时格式的小时(00-23)
用十进制表示的 12 小时格式的小时(00-12)
一年中的第几天(001-366)
月份(01-12)
分钟数(00-59)
换行符 (ASCII LF)
十二进制表示法(AM/PM)
十二进制表示法的时间(等价于 %I:%M:%S %p)。
等价于 %H:%M。
时间的秒数值(00-60)
制表符 (tab)
等价于 %H:%M:%S。
以数字表示的星期(1-7),1 表示星期一。
一年中的第几个星期(第一个星期天作为第一周的开始),00-53
一年中的第几个星期(第一个星期一作为第一周的开始),01-53。
以数字表示的星期(0-6),0表示星期日 。
十进制表示的一年中的第几个星期(第一个星期一作为第一周的开始),00-53。
本地日期表示
本地时间表示
年份模除 100。
十进制表示的完整年份。
时区,表示格式为+HHMM(例如,格式要求生成的 RFC 822或者 RFC 1036 时间头)
时区名称或缩写,如果时区待定则无输出。
位操作函数
第一条语句 cmd = "tr [a-z] [A-Z]" 在 AWK 中建立了一个双向的通信通道。
第二条语句 print 为 tr 命令提供输入。&| 表示双向通信。
第三条语句 close(cmd, "to") 完成执行后关闭 to 进程。
第四条语句 cmd |& getline out 使用 getline 函数将输出存储到 out 变量中。
接下来的输出语句打印输出的内容,最后 close 函数关闭 cmd。
现在我们来测试 nextfile 函数。
$ awk '{ if ($0 ~ /file1:str2/) nextfile; print $0 }' file1.txt file2.txt
输出结果为:
file1:str1
file2:str1
file2:str2
file2:str3
file2:str4