精通awk系列(15):数据类型和字面量
回到:
数据类型
gawk有两种基本的数据类型:数值和字符串。在gawk 4.2.0版本中,还支持第三种基本的数据类型:正则表达式类型。
数据是什么类型在使用它的上下文中决定:在字符串操作环境下将转换为字符串,在数值操作环境下将转换为数值。这和自然语言中的一个词语、一个单词在不同句子内的不同语义是一样的。
隐式转换:
- 算术加0操作可转换为数值类型
"123" + 0
返回数值123" 123abc" + 0
转换为数值时为123- 无效字符串将转换成0,例如
"abc"+3
返回3
- 连接空字符串可转换为字符串类型
123""
转换为字符串”123”
1 | awk 'BEGIN{a="123";print typeof(a+0)}' # number |
显式转换:
- 数值->字符串:
- CONVFMT或sprintf():功能等价。都是指定数值转换为字符串时的格式
1 | awk 'BEGIN{a=123.4567;CONVFMT="%.2f";print a""}' #123.46 |
- 字符串->数值:strtonum()
1 | gawk 'BEGIN{a="123.4567";print strtonum(a)}' # 123.457 |
awk字面量
awk中有3种字面量:字符串字面量、数值字面量和正则表达式字面量。
数值字面量
1 | 结果是123而非123.0 |
算术运算
1 | ++ -- 自增、自减,支持i++和++i或--i或i-- |
赋值操作(优先级最低):
1 | = += -= *= /= %= ^= **= |
疑惑:b = 6;print b += b++
输出结果?可能是12或13。不同的awk的实现在评估顺序上不同,所以不要用这种可能产生歧义的语句。
字符串字面量
awk中的字符串都以双引号包围,不能以单引号包围。
"abc"
""
"\0"
、"\n"
字符串连接(串联):awk没有为字符串的串联操作提供运算符,可以直接连接或使用空格连接。
1 | awk 'BEGIN{print ("one" "two")}' # "onetwo" |
注意:字符串串联虽然方便,但是要考虑串联的优先级。例如下面的:
1 | 下面第一个串联成功,第二个串联失败, |
正则表达式字面量
普通正则:
/[0-9]+/
- 匹配方式:
"str" ~ /pattern/
或"str" !~ /pattern/
- 匹配结果返回值为0(匹配失败)或1(匹配成功)
- 任何单独出现的
/pattern/
都等价于$0 ~ /pattern/
if(/pattern/)
等价于if($0 ~ /pattern/)
- 坑1:
a=/pattern/
等价于将$0 ~ /pattern/
的匹配返回值(0或1)赋值给a - 坑2:
/pattern/ ~ $1
等价于$0 ~ /pattern/ ~ $1
,表示用$1
去匹配0或1 - 坑3:
/pattern/
作为参数传给函数时,传递的是$0~/pat/
的结果0或1 - 坑4.坑5.坑6…
强类型的正则字面量(gawk 4.2.0才支持)
@/pattern/
作为独立的一种数据类型:正则表达式类型- 在使用正则字面量变量进行匹配的时候,不能简写
a=@/Alice/;a{print}
,只能写完整的匹配a=@/Alice/;$0 ~ a{print}
- 解决上面的坑
- 可使用
typeof()
(也是4.2才支持的)检查类型,得到的结果将是regexp
awk 'BEGIN{re=@/abc/;print typeof(re)}'
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 骏马金龙!
评论