awk内置变量之OFMT、CONVFMT、RLENGTH、RSTART

来源:互联网 发布:淘宝换货售后卡怎么写 编辑:程序博客网 时间:2021/12/08 08:58
本篇文章主要简述以下awk内置变量:

OFMT format for printing numbers; initially = "%.6g".

CONVFMT format for internal conversion of numbers to string, initially ="%.6g".

RLENGTH length set by the last call to the built-in function, match().

RSTART index set by the last call to match().

1. OFMT


OFMT format for printing numbers; initially = "%.6g".

表示数字的输出格式,初始是"%.6g",表示一共只输出6位(不包括小数点)。如果是"%.6g",则表示小数点后保留6位

例1:默认格式输出数字
qingsong@db2a:~$ awk '
> BEGIN {
> NUM = 3020112.12456
> print NUM
> }'
3.02011e+06

例2:通过设置OFMT控制输出格式
qingsong@db2a:~$ awk '
> BEGIN { PI = 3.141592653
> print "Default format:", PI
> OFMT = "%.1g"
> print "%.1g:", PI
> OFMT = "%.3g"
> print "%.3g:", PI
> OFMT = "%.8g"
> print "%.8g:", PI
> OFMT = "%.1f"
> print "%.1f:", PI
> OFMT = "%.3f"
> print "%.3f:", PI
> OFMT = "%.8f"
> print "%.8f:", PI
> }'
Default format: 3.14159
%.1g: 3
%.3g: 3.14
%.8g: 3.1415927
%.1f: 3.1
%.3f: 3.142
%.8f: 3.14159265
qingsong@db2a:~$

2. CONVFMT

CONVFMT format for internal conversion of numbers to string, initially = "%.6g".

CONVFMT 表示数字转换为字符串之后,输出的格式。在讲这个变量之前,需要先知道一点,awk只有两种类型的变量:数字和字符串,如果要进行类型转换,可以通过下面的方法:

字符串转数字: string + 0
数字转字符串: number ""

例1:
下面的例子将数字PI转换为字符串输出,并且只输出3位:
qingsong@db2a:~$ awk '
> BEGIN { PI = 3.141592653
> CONVFMT = "%.3g"
> print PI""
> }'
3.14
qingsong@db2a:~$

注意,设置OFMT是没用的,因为它只是控制数字的输出格式,而PI""是由数字转化的字符串,不受其控制:
qingsong@db2a:~$ awk '
> BEGIN { PI = 3.141592653
> OFMT = "%.3g"
> print PI""
> }'
3.14159
qingsong@db2a:~$

3. RLENGTH 和 RSTART

RLENGTH length set by the last call to the built-in function, match().

RSTART index set by the last call to match().

首先需要知道内置函数match(s,r)的作用,s是代表字符串,r代表正则表达式,match的作用是返回匹配r的子串在s中的首个位置
例如,正则表达式 "[+-]?[0-9]+"表示一个整数,那么match("hello+1234","[+-]?[0-9]+")返回值是6,因为从第6位开始是个数字:

qingsong@db2a:~$ awk 'BEGIN { print match("hello+1234","[+-]?[0-9]+") }'
6

RSTART就是match函数的返回值,RLENGTH表示被匹配的子串的长度

例1:下面的例子中,"aaa+"在"baacaaa"中第5个位置开始出现,所以RSTART为5;匹配的子串为"aaa",长度为3,所以RLENGTH为3
qingsong@db2a:~$ awk '
> BEGIN {
> match("baacaaa", "aaa+")
> print RSTART, RLENGTH
> }'
5 3
qingsong@db2a:~$

例2:下面的例子中,使用substr函数打印了匹配的子串,substr第2个参数表示子串开始位置,第3个参数表示子串长度:
qingsong@db2a:~$ awk '
> BEGIN {
> s = "hello-1234x"
> r = "[+-]?[0-9]+"
> match(s, r)
> print substr(s, RSTART,RLENGTH)
> }'
-1234
qingsong@db2a:~$

参考资料:
《The AWK Programming Language》
《Sed and Awk 101 Hacks》