Linux三剑客之awk详解

第一篇 awk简介与表达式实例

  • 一种名字怪异的语言

  • 模式扫描和处理,处理数据和生成报告。

awk不仅仅是linux系统中的一个命令,而且是一种编程语言;它可以用来处理数据和生成报告(excel);处理的数据可以是一个或多个文件;可以是直接来自标准输入,也可以通过管道获取标准输入;awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用。

sed处理stream editor文本流,水流。

一、awk环境简介

本文涉及的awk为gawk,即GNU版本的awk。

1[root@creditease awk]# cat /etc/redhat-release 2CentOS Linux release 7.5.1804 (Core) 3[root@creditease awk]# uname -r 43.10.0-862.el7.x86_64 5[root@creditease awk]# ll `which awk` 6lrwxrwxrwx. 1 root root 4 Nov 7 14:47 /usr/bin/awk -> gawk 7[root@creditease awk]# awk --version 8GNU Awk 4.0.2

二、awk的格式

awk指令是由模式、动作,或者模式和动作的组合组成。

  • 模式即pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把它理解为一个条件。

  • 动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。如下awk使用格式。

三、记录和域

名称

含义

record

记录,行

filed

域,区域,字段,列

1)NF(number of field)表示一行中的区域(列)数量,$NF取最后一个区域。

2)$符号表示取某个列(区域),$1,$2,$NF

3)NR (number of record) 行号,awk对每一行的记录号都有一个内置变量NR来保存,每处理完一条记录NR的值就会自动+1

4)FS(-F)field separator 列分隔符,以什么把行分隔成多列

3.1 指定分隔符

1[root@creditease awk]# awk -F "#" '{print $NF}' awk.txt 2GKL$123 3GKL$213 4GKL$321 5[root@creditease awk]# awk -F '[#$]' '{print $NF}' awk.txt 6123 7213 8321

3.2 条件动作基本的条件和动作

1[root@creditease awk]# cat awk.txt 2ABC#DEF#GHI#GKL$123 3BAC#DEF#GHI#GKL$213 4CBA#DEF#GHI#GKL$321 5[root@creditease awk]# awk -F "#" 'NR==1{print $1}' awk.txt 6ABC

3.3 只有条件

1 [root@creditease awk]# awk -F "#" 'NR==1' awk.txt 2ABC#DEF#GHI#GKL$123

默认会有动作{print $0}

3.4 只有动作

1[root@creditease awk]# awk -F "#" '{print $1}' awk.txt 2ABC 3BAC 4CAB

默认处理所有行

3.5 多个模式和动作

1[root@creditease awk]# awk -F "#" 'NR==1{print $NF}NR==3{print $NF}' awk.txt 2GKL$123 3GKL$321

3.6 对$0的认识

awk中$0表示整行

1[root@creditease awk]# awk '{print $0}' awk_space.txt 2ABC DEF GHI GKL$123 3BAC DEF GHI GKL$213 4CBA DEF GHI GKL$321

3.7 FNR

FNR与NR类似,不过多文件记录不递增,每个文件都从1开始(后边处理多文件会讲到)

1[root@creditease awk]# awk '{print NR}' awk.txt awk_space.txt 21 32 43 54 65 76 8[root@creditease awk]# awk '{print FNR}' awk.txt awk_space.txt 91 102 113 121 132 143

四、正则表达式与操作符

awk同sed一样也可以通过模式匹配来对输入的文本进行匹配处理。 awk也支持大量的正则表达式模式,大部分与sed支持的元字符类似,而且正则表达式是玩转三剑客的必备工具。

awk支持的正则表达式元字符

awk默认不支持的元字符,和需要添加参数才能支持的元字符

元字符

功能

示例

解释

x{m}

x重复m次

/cool{5}/

需要注意一点的是,cool加括号或不加括号的区别,x可以使字符串也可以只是一个字符,所以/cool{5}/表示匹配coo再加上5个l,即coolllll。/(cool){2,}/表示匹配coolcool,coolcoolcool等。

x{m,}

x重复至少m次

/(cool){2,}/

同上

x{m,n}

x重复至少m次,但不超过n次,需要指定参数:--posix或者--re-interval。没有该参数不能使用这种模式

/(cool){5,6}/

同上

正则表达式的运用,默认是在行内查找匹配的字符串,若有匹配则执行action操作,但是有时候仅需要固定的列表匹配指定的正则表达式。

比如:

我想取/etc/passwd文件中第五列($5)这一列查找匹配mail字符串的行,这样就需要用另外两个匹配操作符。并且awk里面只有这两个操作符来匹配正则表达式的。

正则匹配操作符

~

用于对记录或区域的表达式进行匹配。

!~

用于表达与~相反的意思。

4.1 正则实例

1)显示awk.txt中GHI列

1[root@creditease awk]# cat awk.txt 2ABC#DEF#GHI#GKL$123 3BAC#DEF#GHI#GKL$213 4CBA#DEF#GHI#GKL$321 5[root@creditease awk]# awk -F "#" '{print $3}' awk.txt 6GHI 7GHI 8GHI 9[root@creditease awk]# awk -F "#" '{print $(NF-1)}' awk.txt 10GHI 11GHI 12GHI

2)显示包含321的行

1[root@creditease awk]# awk '/321/{print $0}' awk.txt 2CBA#DEF#GHI#GKL$321

3)以#为分隔符,显示第一列以B开头或最后一列以1结尾的行

1[root@creditease awk]# awk -F "#" '$1~/^B/{print $0}$NF~/1$/{print $0}' awk.txt 2BAC#DEF#GHI#GKL$213 3CBA#DEF#GHI#GKL$321

4)以#为分隔符,显示第一列以B或C开头的行

1[root@creditease awk]# awk -F "#" '$1~/^B|^C/{print $0}' awk.txt 2BAC#DEF#GHI#GKL$213 3CBA#DEF#GHI#GKL$321 4[root@creditease awk]# awk -F "#" '$1~/^[BC]/{print $0}' awk.txt 5BAC#DEF#GHI#GKL$213 6CBA#DEF#GHI#GKL$321 7[root@creditease awk]# awk -F "#" '$1~/^(B|C)/{print $0}' awk.txt 8BAC#DEF#GHI#GKL$213 9CBA#DEF#GHI#GKL$321 10[root@creditease awk]# awk -F "#" '$1!~/^A/{print $0}' awk.txt 11BAC#DEF#GHI#GKL$213 12CBA#DEF#GHI#GKL$321

五、比较表达式

awk是一种编程语言,能够进行更为复杂的判断,当条件为真时,awk就执行相关的action,主要是在针对某一区域做出相关的判断,比如打印成绩在80分以上的,这样就必须对这一个区域作比较判断.

下表列出了awk可以使用的关系运算符,可以用来比较数字字符串,还有正则表达式,当表达式为真的时候,表达式结果为1,否则为0,只有表达式为真,awk才执行相关的action。

awk支持的关系运算符

运算符

含义

示例

<

小于

x>y

<=

小于或等于。

x<=y

==

等于

x==y

!=

不等于

x!=y

>=

大于或等于

x>=y

>

大于

x<y

5.1 比较表达式实例

显示awk.txt的第2 ,3 行

NR //,//

1[root@creditease awk]# awk 'NR==2{print $0}NR==3{print $0}' awk.txt 2BAC#DEF#GHI#GKL$213 3CBA#DEF#GHI#GKL$321 4[root@creditease awk]# awk 'NR>=1{print $0}' awk.txt 5ABC#DEF#GHI#GKL$123 6BAC#DEF#GHI#GKL$213 7CBA#DEF#GHI#GKL$321 8[root@creditease awk]# awk '/BAC/,/CBA/{print $0}' awk.txt 9BAC#DEF#GHI#GKL$213 10CBA#DEF#GHI#GKL$321

第二篇 awk模块、变量与执行

完整awk结构图如下:

一、BEGIN模块

BEGIN模块在awk读取文件之前就执行,BEGIN模式常常被用来修改内置变量ORS,RS,FS,OFS等的值。可以不接任何输入文件

二、awk内置变量(预定义变量)

变量名

属性

$0

当前记录,一整行

$1,$2,$3....$a

当前记录的第n个区域,区域间由FS分隔。

FS

输入区域分隔符,默认是空格。field separator

NF

当前记录中的区域个数,就是有多少列。number of field

NR

已经读出的记录数,就是行号,从1开始。number of record

RS

输入的记录分隔符默认为换行符。record separator

OFS

输出区域分隔符,默认也是空格。output record separator

FNR

当前文件的读入记录号,每个文件重新计算。

FILENAME

当前正在处理的文件的文件名

特别提示:FS RS支持正则表达式

2.1 第一个作用: 定义内置变量

1[root@creditease awk]# awk 'BEGIN{RS="#"}{print $0}' awk.txt 2ABC 3DEF 4GHI 5GKL$123 6BAC 7DEF 8GHI 9GKL$213 10CBA 11DEF 12GHI 13GKL$321

2.2 第二个作用:打印标识

1[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}' awk.txt 2=======start====== 3ABC#DEF#GHI#GKL$123 4BAC#DEF#GHI#GKL$213 5CBA#DEF#GHI#GKL$321

2.3 awk实现计算功能

1 [root@creditease files]# awk 'BEGIN{a=8;b=90;print a+b,a-c,a/b,a%b}' 298 8 0.0888889 8

三、END模块

END在awk读取完所有的文件的时候,再执行END模块,一般用来输出一个结果(累加,数组结果)。也可以是和BEGIN模块类似的结尾标识信息。

3.1 第一个作用:打印标识

1[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}END{print "=======end======"}' awk.txt 2=======start====== 3ABC#DEF#GHI#GKL$123 4BAC#DEF#GHI#GKL$213 5CBA#DEF#GHI#GKL$321 6=======end======

3.2 第二个作用:累加

1)统计空行(/etc/services文件)

grep sed awk

1[root@creditease awk]# grep "^$" /etc/services |wc -l 217 3[root@creditease awk]# sed -n '/^$/p' /etc/services |wc -l 417 5[root@creditease awk]# awk '/^$/' /etc/services |wc -l 617 7[root@creditease awk]# awk '/^$/{i=i+1}END{print i}' /etc/services 817

2)算术题

1+2+3......+100=5050,怎么用awk表示?

1[root@creditease awk]# seq 100|awk '{i=i+$0}END{print i}' 25050

四、awk详解小结

1、BEGIN和END模块只能有一个,BEGIN{}BEGIN{}或者END{}END{}都是错误的。

2、找谁干啥模块,可以是多个。

五、awk执行过程总结

awk执行过程:

1、命令行的赋值(-F或-V)

2、执行BEGIN模式里面的内容

3、开始读取文件

4、判断条件(模式)是否成立

  • 成立则执行对应动作里面的内容
  • 读取下一行,循环判断
  • 直到读取到最后一个文件的结尾

5、最后执行END模式里面的内容

第三篇:awk数组与语法

一、awk数组

1.1 数组结构

people[police]=110

people[doctor]=120

1[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";print word[0],word[1]}' 2credit easy 3[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";for(i in word)print word[i]}' 4credit 5easy

1.2 数组分类

索 引数组:以数字为下标
关联数组:以字符串为下标

1.3 awk关联数组

现有如下文本,格式如下:即左边是随机字母,右边是随机数字, 即将相同的字母后面的数字加在一起,按字母的顺序输出

1a 1 2b 3 3c 2 4d 7 5b 5 6a 3 7g 2 8f 6

以$1为下标,创建数组a[$1]=a[$1]+$2(a[$1]+=$2)然后配合END和for循环输出结果:

1[root@creditease awk]# awk '{a[$1]=a[$1]+$2}END{for(i in a)print i,a[i]}' jia.txt 2a 4 3b 8 4c 2 5d 7 6f 6 7g 2 8注意:for(i in a) 循环的顺序不是按照文本内容的顺序来处理的,排序可以在命令后加sort排序

1.4 awk索引数组

以数字为下标的数组 seq生成1-10的数字,要求只显示计数行

1[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR;i+=2){print a[i]}}' 21 33 45 57 69

seq生成1-10的数字,要求不显示文件的后3行

1[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR-3;i++){print a[i]}}' 21 32 43 54 65 76 87 9解析:改变i的范围即可,多用于不显示文件的后几行

1.5 awk数组实战去重

a++ 和 ++a

1[root@creditease awk]# awk 'BEGIN{print a++}' 20 3[root@creditease awk]# awk 'BEGIN{print ++a}' 41 5[root@creditease awk]# awk 'BEGIN{a=1;b=a++;print a,b}' 62 1 7[root@creditease awk]# awk 'BEGIN{a=1;b=++a;print a,b}' 82 2 9 10注: 11 12都是 b = a+1 13 14b=a++ 先把 a 的值赋予b,然后 a + 1 15 16b=++a 先执行a+1,然后把a的值赋予b

对一下文本进行去重处理 针对第二列去重

1[root@creditease awk]# cat qc.txt 22018/10/20 xiaoli 13373305025 32018/10/25 xiaowang 17712215986 42018/11/01 xiaoliu 18615517895 52018/11/12 xiaoli 13373305025 62018/11/19 xiaozhao 15512013263 72018/11/26 xiaoliu 18615517895 82018/12/01 xiaoma 16965564525 92018/12/09 xiaowang 17712215986 102018/11/24 xiaozhao 15512013263 11 12 13解法一: 14[root@creditease awk]# awk '!a[$2]++' qc.txt 152018/10/20 xiaoli 13373305025 162018/10/25 xiaowang 17712215986 172018/11/01 xiaoliu 18615517895 182018/11/19 xiaozhao 15512013263 192018/12/01 xiaoma 16965564525 20解析: 21!a[$3]++是模式(条件),命令也可写成awk '! 22a[$3]=a[$3]+1{print $0}' qc.txt 23a[$3]++ ,“++”在后,先取值后加一 24!a[$3]=a[$3]+1:是先取a[$3]的值,比较“!a[$3]”是否符合条件(条件非0),后加1 25注意:此方法去重后的结果显示的是文本开头开始的所有不重复的行 26解法二: 27[root@creditease awk]# awk '++a[$2]==1' qc.txt 282018/10/20 xiaoli 13373305025 292018/10/25 xiaowang 17712215986 302018/11/01 xiaoliu 18615517895 312018/11/19 xiaozhao 15512013263 322018/12/01 xiaoma 16965564525 33解析: 34++a[$3]==1是模式(条件),也可写成a[$3]=a[$3]+1==1即只有当条件(a[$3]+1的结果)为1的时候才打印出内容 35++a[$3] ,“++”在前,先加一后取值 36++a[$3]==1:是先加1,后取a[$3]的值,比较“++a[$3]”是否符合条件(值为137注意:此方法去重后的结果显示的是文本开头开始的所有不重复的行 38解法三: 39[root@creditease awk]# awk '{a[$2]=$0}END{for(i in a){print a[i]}}' qc.txt 402018/11/12 xiaoli 13373305025 412018/11/26 xiaoliu 18615517895 422018/12/01 xiaoma 16965564525 432018/12/09 xiaowang 17712215986 442018/11/24 xiaozhao 15512013263 45 46解析: 47注意此方法去重后的结果显示的是文本结尾开始的所有不重复的行

1.6 awk处理多个文件(数组、NR、FNR)

使用awk取file.txt的第一列和file1.txt的第二列然后重定向到一个新文件new.txt中

1[root@creditease awk]# cat file1.txt 2a b 3c d 4e f 5g h 6i j 7[root@creditease awk]# cat file2.txt 81 2 93 4 105 6 117 8 129 10 13[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2}' file1.txt file2.txt 14a 2 15c 4 16e 6 17g 8 18i 10 19解析:NR==FNR处理的是第一个文件,NR!=FNR处理的是第二个文件. 20注意:当两个文件NR(行数)不同的时候,需要把行数多的放前边. 21解决方法:把行数多的文件放前边,行数少的文件放后边. 22把输出的结果放入一个新文件new.txt中: 23[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2>"new.txt"}' file1.txt file2.txt 24[root@creditease awk]# cat new.txt 25a 2 26c 4 27e 6 28g 8 29i 10

1.7 awk分析日志文件,统计访问网站的个数

1[root@creditease awk]# cat url.txt 2http://www.baidu.com 3http://mp4.video.cn 4http://www.qq.com 5http://www.listeneasy.com 6http://mp3.music.com 7http://www.qq.com 8http://www.qq.com 9http://www.listeneasy.com 10http://www.listeneasy.com 11http://mp4.video.cn 12http://mp3.music.com 13http://www.baidu.com 14http://www.baidu.com 15http://www.baidu.com 16http://www.baidu.com 17[root@creditease awk]# awk -F "[/]+" '{h[$2]++}END{for(i in h) print i,h[i]}' url.txt 18www.qq.com 3 19www.baidu.com 5 20mp4.video.cn 2 21mp3.music.com 2 22www.crediteasy.com 3

二、awk简单语法

2.1 函数sub gsub

替换功能

格式:sub(r, s ,目标) gsub(r, s ,目标)

1[root@creditease awk]# cat sub.txt 2ABC DEF AHI GKL$123 3BAC DEF AHI GKL$213 4CBA DEF GHI GKL$321 5[root@creditease awk]# awk '{sub(/A/,"a");print $0}' sub.txt 6aBC DEF AHI GKL$123 7BaC DEF AHI GKL$213 8CBa DEF GHI GKL$321 9[root@creditease awk]# awk '{gsub(/A/,"a");print $0}' sub.txt 10aBC DEF aHI GKL$123 11BaC DEF aHI GKL$213 12CBa DEF GHI GKL$321 13注:sub只会替换行内匹配的第一次内容;相当于sed ‘s###’ 14 gsub 会替换行内匹配的所有内容;相当于sed ‘s###g’ 15[root@creditease awk]# awk '{sub(/A/,"a",$1);print $0}' sub.txt 16aBC DEF AHI GKL$123 17BaC DEF AHI GKL$213 18CBa DEF GHI GKL$321

练习:

10001|20081223efskjfdj|EREADFASDLKJCV 20002|20081208djfksdaa|JDKFJALSDJFsddf 30003|20081208efskjfdj|EREADFASDLKJCV 40004|20081211djfksdaa1234|JDKFJALSDJFsddf 5'|'为分隔, 现要将第二个域字母前的数字去掉,其他地方都不变, 输出为: 60001|efskjfdj|EREADFASDLKJCV 70002|djfksdaa|JDKFJALSDJFsddf 80003|efskjfdj|EREADFASDLKJCV 90004|djfksdaa1234|JDKFJALSDJFsddf 10 11方法: 12awk -F '|' 'BEGIN{OFS="|"}{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt 13awk -F '|' -v OFS="|" '{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt

2.2 if和slse的用法

内容:

AA

BC

AA

CB

CC

AA

结果:

AA YES

BC NO YES

AA YES

CB NO YES

CC NO YES

AA YES

11) [root@creditease awk]# awk '{if($0~/AA/){print $0" YES"}else{print $0" NO YES"}}' ifelse.txt 2AA YES 3BC NO YES 4AA YES 5CB NO YES 6CC NO YES 7AA YES 8解析:使用ifelseif $0匹配到AA,则打印$0 "YES"else反之打印$0 " NO YES"92[root@creditease awk]# awk '$0~/AA/{print $0" YES"}$0!~/AA/{print $0" NO YES"}' ifelse.txt 10AA YES 11BC NO YES 12AA YES 13CB NO YES 14CC NO YES 15AA YES 16解析:使用正则匹配,当$0匹配AA时,打印出YES,反之,打印出“NO YES

2.3 next用法

如上题,用next来实现

next :跳过它后边的所有代码

1 [root@creditease awk]# awk '$0~/AA/{print $0" YES";next}{print $0" NO YES"}' ifelse.txt 2AA YES 3BC NO YES 4AA YES 5CB NO YES 6CC NO YES 7AA YES 8解析: 9{print $0" NO YES"}:此动作是默认执行的,当前边的$0~/AA/匹配,就会执行{print $0" YES";next} 10因为action中有next,所以会跳过后边的action。 11如果符合$0~/AA/则打印YES ,遇到next后,后边的动作不执行;如果不符合$0~/AA/,会执行next后边的动作; 12next前边的(模式匹配),后边的就不执行,前边的不执行(模式不匹配),后边的就执行。

2.4 printf不换行输出以及next用法

printf :打印后不换行

如下文本,如果 Description:之后为空,将其后一行内容并入此行。

1Packages: Hello-1 2Owner: me me me me 3Other: who care? 4Description: 5Hello world! 6Other2: don't care 7想要结果: 8Packages: Hello-1 9Owner: me me me me 10Other: who care? 11Description: Hello world! 12Origial-Owner: me me me me 13Other2: don't care 141[root@creditease awk]# awk '/^Desc.*:$/{printf $0}!/Desc.*:$/{print $0}' printf.txt 15Packages: Hello-1 16Owner: me me me me 17Other: who care? 18Description:Hello world! 19Other2: don't care 20解析:使用正则匹配,匹配到'/^Desc.*:$/,就使用printf打印(不换行),不匹配的打印出整行。 212)使用ifelse实现 22[root@creditease awk]# awk '{if(/Des.*:$/){printf $0}else{print $0}}' printf.txt 23Packages: Hello-1 24Owner: me me me me 25Other: who care? 26Description:Hello world! 27Other2: don't care 283)使用next实现 29[root@creditease awk]# awk '/Desc.*:$/{printf $0;next}{print $0}' printf.txt 30Packages: Hello-1 31Owner: me me me me 32Other: who care? 33Description:Hello world! 34Other2: don't care 35注:可简写成awk '/Desc.*:$/{printf $0;next}1' 36printf.txt ## 1是pattern(模式),默认action(动作)是{print $0}

2.5 去重后计数按要求重定向到指定文件

文本如下,要求计算出每项重复的个数,然后把重复次数大于2的放入gt2.txt文件中,把重复次数小于等于2的放入le2.txt文件中

1[root@creditease files]# cat qcjs.txt 2aaa 3bbb 4ccc 5aaa 6ddd 7bbb 8rrr 9ttt 10ccc 11eee 12ddd 13rrr 14bbb 15rrr 16bbb 17[root@creditease awk]# awk '{a[$1]++}END{for(i in a){if(a[i]>2){print i,a[i]>"gt2.txt"}else{print i,a[i]>"le2.txt"}}}' qcjs.txt 18[root@creditease awk]# cat gt2.txt 19rrr 3 20bbb 4 21[root@creditease awk]# cat le2.txt 22aaa 2 23ccc 2 24eee 1 25ttt 1 26ddd 2 27解析:{print },或括号中打印后可直接重定向到一个新文件,文件名用双引号引起来。如: {print $1 >"xin.txt"}

三、awk需注意事项

a)NR==FNR ##不能写成NR=FNR(=在awk中是赋值的意思)

b)NR!=FNR ##NR不等于FNR

c){a=1;a[NR]} 这样会报错:同一条命令中变量和数组名不能重复 d)printf 输出的时候不换行

e){print },或括号中打印后可直接重定向到一个新文件,文件名用双引号引起来。如: {print $1 >"xin.txt"}

f)当模式(条件)是0的时候,后边的动作不执行,!0的时候后边动作才执行。

作者:秦伟

来源:宜信技术学院

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )