• (12)awk数据类型和字面量


    数据类型

    gawk有两种基本的数据类型:数值和字符串。在gawk 4.2.0版本中,还支持第三种基本的数据类型:正则表达式类型。

    数据是什么类型在使用它的上下文中决定:在字符串操作环境下将转换为字符串,在数值操作环境下将转换为数值。这和自然语言中的一个词语、一个单词在不同句子内的不同语义是一样的。

    隐式转换:

    • 算术加0操作可转换为数值类型
      • "123" + 0返回数值123
      • " 123abc" + 0转换为数值时为123
      • 无效字符串将转换成0,例如"abc"+3返回3
    • 连接空字符串可转换为字符串类型
      • 123""转换为字符串"123"
    [root@docker-01 ~]# awk 'BEGIN{a="123";print typeof(a+0)}'
    number
    [root@docker-01 ~]# awk 'BEGIN{a=123;print typeof(a"")}'
    string
    [root@docker-01 ~]# awk 'BEGIN{a=2;b=3;print(a b)+4}'
    27

    显式转换:

    • 数值->字符串:
      • CONVFMT或sprintf():功能等价。都是指定数值转换为字符串时的格式
    [root@docker-01 ~]# awk 'BEGIN{a=123.4567;CONVFMT="%.2f";print a""}'
    123.46
    [root@docker-01 ~]# awk 'BEGIN{a=123.4567;print sprintf("%.2f", a)}'
    123.46
    [root@docker-01 ~]# awk 'BEGIN{a=123.4567;printf("%.2f",a)}' 
    123.46
    • 字符串->数值:strtonum()
    [root@docker-01 ~]# gawk 'BEGIN{a="123.4567";print strtonum(a)}'
    123.457

    awk字面量

    awk中有3种字面量:字符串字面量、数值字面量和正则表达式字面量。

    数值字面量

    整数、浮点数、科学计数
    105    105.1    1.05e+2    1050e-1
    awk内部总是使用浮点数方式保存所有数值,但用户使用可以转换成整数的数值时总会去掉小数点。
    数值12.0面向用户的值是12,12面向awk内部的值是12.00000.....0
    # 结果是123而非123.0
    [root@docker-01 ~]# awk 'BEGIN{a=123.0;print a}'
    123

    算术运算

    ++ --    自增、自减,支持i++和++i或--i或i--  
    ^        幂运算(**也用于幂运算)
    + -      一元运算符(正负数符号)
    * / %    乘除取模运算
    + -      加减法运算
    
    # 注:
    # 1.++和--既可以当作独立语句,也可以作为表达式,如:
    #     awk 'BEGIN{a=3;a++;a=++a;print a}'
    # 2.**或^幂运算是从右向左计算的:print 2**1**3得到2而不是8

    赋值操作(优先级最低)

    = += -= *= /= %= ^= **=

    疑惑:b = 6;print b += b++输出结果?可能是12或13。不同的awk的实现在评估顺序上不同,所以不要用这种可能产生歧义的语句。

    字符串字面量

    awk中的字符串都以双引号包围,不能以单引号包围。

    "abc"
    ""
    """
    "

    字符串连接(串联):awk没有为字符串的串联操作提供运算符,可以直接连接或使用空格连接。

    [root@docker-01 ~]# awk 'BEGIN{print ("one" "two")}'
    onetwo
    [root@docker-01 ~]# awk 'BEGIN{print ("one""two")}'
    onetwo
    [root@docker-01 ~]# awk 'BEGIN{a="one";b="two";print (a b)}'
    onetwo

    注意:字符串串联虽然方便,但是要考虑串联的优先级。例如下面的:

    # 下面第一个串联成功,第二个串联失败,
    # 因为串联优先级低于加减运算,等价于`12 (" " -23)`
    # 即:先转为数值0-23,再转为字符串12-23
    [root@docker-01 ~]# awk 'BEGIN{a="one";b="two";print (12 " " 23)}'
    12 23
    [root@docker-01 ~]# awk 'BEGIN{a="one";b="two";print (12 " " -23)}'
    12-23

    正则表达式字面量

    普通正则:
    
    /[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)}'
  • 相关阅读:
    ROW_NUMBER() OVER函数的基本用法
    oracle 中的next_day函数
    宽带大小与实际网速的关系:
    ora-29280 invalid directory path
    [spring]Attribute "scope" must be declared for element type "bean"
    什么是JDK,JRE,SDK,JVM以及API
    管理的常识: 让管理者发挥绩效的7个基本概念 读书笔记
    lua __index的简写
    lua中设置table={}时需要注意的坑
    摄像机旋转
  • 原文地址:https://www.cnblogs.com/liujunjun/p/12396186.html
Copyright © 2020-2023  润新知