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

数据类型

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

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

隐式转换:

  • 算术加0操作可转换为数值类型

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

显式转换:

  • 数值->字符串:

    • CONVFMT或sprintf():功能等价。都是指定数值转换为字符串时的格式
[[email protected]01 ~]# awk ‘BEGIN{a=123.4567;CONVFMT="%.2f";print a""}‘
123.46
[[email protected]-01 ~]# awk ‘BEGIN{a=123.4567;print sprintf("%.2f", a)}‘
123.46
[[email protected]-01 ~]# awk ‘BEGIN{a=123.4567;printf("%.2f",a)}‘
123.46
  • 字符串->数值:strtonum()
[[email protected]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
[[email protected]-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"
""
"\0"、"\n"

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

[[email protected]01 ~]# awk ‘BEGIN{print ("one" "two")}‘
onetwo
[[email protected]-01 ~]# awk ‘BEGIN{print ("one""two")}‘
onetwo
[[email protected]-01 ~]# awk ‘BEGIN{a="one";b="two";print (a b)}‘
onetwo

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

# 下面第一个串联成功,第二个串联失败,
# 因为串联优先级低于加减运算,等价于`12 (" " -23)`
# 即:先转为数值0-23,再转为字符串12-23
[[email protected]-01 ~]# awk ‘BEGIN{a="one";b="two";print (12 " " 23)}‘
12 23
[[email protected]-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[email protected]/Alice/;a{print},只能写完整的匹配[email protected]/Alice/;$0 ~ a{print}
解决上面的坑
可使用typeof()(也是4.2才支持的)检查类型,得到的结果将是regexp
awk ‘BEGIN{[email protected]/abc/;print typeof(re)}‘

原文地址:https://www.cnblogs.com/liujunjun/p/12396186.html

时间: 2024-07-31 15:49:26

(12)awk数据类型和字面量的相关文章

精通awk系列(15):awk数据类型和字面量

回到: Linux系列文章 Shell系列文章 Awk系列文章 数据类型 gawk有两种基本的数据类型:数值和字符串.在gawk 4.2.0版本中,还支持第三种基本的数据类型:正则表达式类型. 数据是什么类型在使用它的上下文中决定:在字符串操作环境下将转换为字符串,在数值操作环境下将转换为数值.这和自然语言中的一个词语.一个单词在不同句子内的不同语义是一样的. 隐式转换: 算术加0操作可转换为数值类型 "123" + 0返回数值123 " 123abc" + 0转换

java基本数据类型的字面量

java的基本数据类型一共有8种.其中:(每种类型后面列出了java中的该类型的字面量) 四种整型: int  4字节: 12  +12  -12  077 0xFF  0b101(JDK7中支持的二进制表示)  字面范围:0x800000000 --> 0x7FFFFFFF short  2字节: 2个字节内的int字面量可以认为是short类型的字面量,可以给short变量赋值  字面范围:(short)0x8000 -->  0x7FFF long 8字节:    int字面量形式后加字

Swift语言指南(五)--数字字面量和数字类型转换

数字字面量 整数字面量写法如下: · 十进制数,无前缀 · 二进制数,以 0b 为前缀 · 八进制数,以 0o 为前缀 · 十六进制数,以 0x 为前缀 下面所有整数的十进制值为 17 : 1 let decimalInteger = 17 2 let binaryInteger = 0b10001 // 17 二进制标识 3 let octalInteger = 0o21 // 17 八进制标识 4 let hexadecimalInteger = 0x11 // 17 十六进制标识 浮点数字

OC基础第五讲--Block、数组高级、字面量

Block 1.1block与函数指针 函数: int sum(int x, int y) { retrun x + y; } 函数指针: 把上面函数原型int sum(int x, int y)中的函数名替换成(*p),即可得到一个函数指针int (*p)(int x, int y). 这个函数表示指针p指向一个函数,这个函数有两个int型参数,返回值是int类型. Block:把函数指针int (*p)(int x, int y)中的'*'换成'^'就是我们block的声明,即int (^p

JavaScript语言精粹1字符串,对象字面量

字符串 Strings JavaScript没有,字符,类型.仅包含一个字符的,字符串即可. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>testString1</title> <style type="text/css"></style> </hea

第六讲 Block块语法及Block与数组的排序,ios字面量的使用(源代码上传)

1 #import <Foundation/Foundation.h> 2 3 4 #import "Student.h" 5 6 int c =200; 7 int main(int argc, const char * argv[]) { 8 @autoreleasepool { 9 /* 10 ------------------------------------- 11 定义block变量的四种方法 12 -----------------------------

Javascript正则构造函数与正则表达字面量&amp;&amp;常用正则表达式

本文不讨论正则表达式入门,即如何使用正则匹配.讨论的是两种创建正则表达式的优劣和一些细节,最后给出一些常用正则匹配表达式. Javascript中的正则表达式也是对象,我们可以使用两种方法创建正则表达式: 使用new RegExp()构造函数 使用正则表达字面量 先说结果,使用正则表达字面量的效率更高. 下面的示例代码演示了两种可用于创建正则表达式以匹配反斜杠的方法: 1 //正则表达字面量 2 var re = /\\/gm; 3 4 //正则构造函数 5 var reg = new RegE

block 数值排序 字面量的使用

//  创建一个block //  1.返回值 //  2.使用'^'标记一个Block,并写出Block变量 //  3.确定Block参数列表,参数名可以省略 //  4.'^' //  5.参数列表 //  6.主题部分,'{}:' //  7.在'{}'内部写具体实现 int (^myBlock)(int, int) = ^(int a, int b){ return a + b; }; int (^myBlock1)(int, int) = ^(int c, int d){ retur

ES6模板字面量

前面的话 JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串.字符串格式化.HTML转义等.ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系,通过一些全新的方法来解决类似的问题.本文将详细介绍ES6模板字面量 基本用法 模板字面量是增强版的字符串,它用反引号(`)标识 let message = `Hello world!`; console.log(message); // "Hello world!" conso