AWK学习笔记 (1)
1.AWK简介 (1)
2.AWK编程模型 (2)
3. 常量与转义符 (3)
4. 变量 (3)
4.1用户定义变量 (3)
4.2系统变量 (4)
4.3字段变量 (4)
5 数组 (5)
6 操作符 (5)
7 流程控制 (6)
8 函数 (7)
8.1 算术函数 (7)
8.2 字符串函数 (7)
8.3 字节处理函数 (8)
8.4 时间函数 (8)
8.5 用户自定义函数 (9)
正则匹配加减乘除9 输入输出 (9)
9.1 输入 (9)
9.2 输出 (10)
10 总结 (10)
11. 参考文献 (10)
AWK学习笔记
1.AWK简介
AWK是Alfred V.Aho, Peter J.Weinberger,Brian W.Kerninghan三人在1977设计和实施的,最初是为了试验Unix中的grep和sed工具怎样可以一般化地在文本之外还能处理数据(grep和sed主要是文本处理工具,但AWK同时善于处理文本与数据)。AWK名字的来源是创造此语言的三个人的名字首字母缩写。它的主要来源是grep, sed和C。后继者主要有Perl。
AWK非常适合于处理格式化的文本和数据,比如改变数据的格式、验证其合法性、寻某些属性的项、数字求和、输出数据报表等。数据的结构化越强,使用AWK会越方便。相比于sed,它有字段(sed只有行而没有内置的字段模型)和数字处理功能。相比于C和Perl,由于它自动化了某些处理流程(比如读取文件和分割字段),可以使得某些任务以比C 和Perl少得多的代码来完成。
AWK(相对于Perl)的不足:一是各种复杂的数据结构难以实现;二是对Unicode的支持不好。
2.AWK编程模型
AWK程序的基本使用语法如下:
awk[-v var=value] -Fre'pattern{ action}' var=value datafile(s)
awk[-v var=value] -Fre-f scriptfile var=value datafile(s)
用命令行与用脚本文件(scriptfie)是等价的。一般来说,若pattern、action的代码量比较大,倾向于使用脚本文件。
对于以上语法说明如下:
●-v 选项定义的变量在脚本运行之前即存在,可以在脚本的BEGIN流程中被调用;
●命令行参量(不用-v定义的)只有到输入的第一行读入时才有效,即其在BEGIN流程
中无效;
●-F选项将字段分割符(FS)设为一个正则表达式re;
●datafile(s)可以是单个文件,也可以是多个文件,可使用正则表达式)。如果用“-”
(不包括引号)表示从命令行输入。
●命令行输入‘pattern{action}’时单引号是必不可少的!不要忘记。pattern和action
都是可选的,但是不能都省略。省略pattern时默认匹配所有行;省略action时默认为输出整行。为了分别pattern和action, action需要用{}括起来。
脚本文件的一般格式为:
BEGIN{
…
}
pattern1 { action1 }
pattern2 { action2 }
…
END{
…
}
这也说明了AWK的编程模型:程序开始处理BEGIN流程(一般是设置分隔符、定义变量以及输出信息行等),然后进入
主循环,读入数据每一行,本行数据设为$0, 行数为NR(某一文件的行数为FNR),同时根据FS变量将$0切分为NF个字段,分别用$1,$2,…,$NF标识。程序对每一行用pattern进行匹配,若匹配上则运行action。在所有行处理完后,程序将处理END流程(一般是进行后期处理,输出综合结果等)。
说明:
●程序默认的字段分割符(FS)是“[ \t]+”(Tab或空格),输出分割符(OFS)是“”,
(空格),默认记录分隔符(RS)是“\n”,可根据需要在命令行或BEGIN中修改;
●pattern可以是以下四种格式:
(1)表达式(expression). 在表达式为真时执行action.
(2)正则表达式(/regular expression/), 正则表达式匹配上时执行action.
(3)复合模式(compound pattern),用&&(AND), ||(OR),!(NOT)和括号组合出的模式,组合模式为真时执行action.
(4)范围模式(pattern1,pattern2),从pattern1匹配上的行,直到pattern2匹配上的行,包括这两行。如果pattern2一直没有匹配上,则到文件的末尾。 action默认一行一条指令,可包括多行。如果需要在一行中包括多个语句,需要用分号(;)分割开。但是一行一个语句则不需要加分号。这里有与C语言相同又有不同的地方,请注意区别。
3. 常量与转义符
AWK的常量有字符由字符串常量与数值常量组成,字符串常量含引号,而数值常量没有。AWK的转义符如下:
符号描述
\a警告字符,通常是ASCII BEL字符
\b退行
\f Formfeed
\n换行
\r回车
\t TAB
\ddd八进制
\c任何字符c比如\"代表"
4. 变量
AWK的变量包括用户定义变量(User-defined Variables)、系统变量(System Variables)和字段变量(Field Variables)。分别说明如下:
4.1用户定义变量
AWK的变量不需要声明,也不需要初始化,直接使用。每一个变量同时有一个字符值和数值,AWK根据上下文环境决定作为数值或字符串处理,这是A WK极其独特之处。AWK自动将变量初始化为空值,如果用作数字将作为0。如果需要强制使用字符串,可使用number “”(空格在AWK中是字符串连接符),若需要强制用作数值,可以用string + 0。
另外应注意,在AWK中,$表示字段,用户变量不需要加$,这是AWK与shell或者Perl不同之处!在shell中,变量定义时不加$,再次引用时则需要用$,而在Perl中,无论定义和引用时都需要加$(Perl中$表示标量,另有@和%符号表示数组和Hash变量)。
4.2系统变量
AWK中包括两种系统变量:默认值可被改变的变量和处理过程中变量。AWK的系统变量列表如下:
变量意义默认值
FS字段分割符“[ \t]+”
OFS输出字段分隔符“”
RS记录分割符”\n”
ORS输出记录分隔符”\n”
OFMT输出数字格式”%.6g”CONVFMT控制数值向字符串转换”%.6g”
NF字段数-
-
NR当前输入记录数(总数),只有到END时,NR
才等于总记录数
FNR当前文件的相对记录数
FILENAME当前输入文件名
ARGC命令行参数数目
ARGV命令行参数数组
ENVIRON环境变量数组
RSTART match()匹配到的初始位置
RLENGTH match()匹配到的字符串长度
SUBSEP数组分隔符。将(I,J) 转换为I SUBSEP J, 模拟多
维数组用
注意:
●ARGV数组由ARGV[0] ,…,ARGV[ARGC-1]组成,第一个元素指标是0而不是1。这
与AWK中的一般数组不同,而与C一致。
●ENVIRON数组在shell与AWK的交互中非常有用。使用ENVIRON[“PARA_NAME”]
来获取环境变量$PARA_NAME的值,其中的引号””不可少!
4.3字段变量
从$1,$2一直到$NF,整行用$0标识。注意,如果$0被赋予新值,所有的$1, $2,..和NF 都会被重新计算。同样,若$i,被改变,$0将用OFS重新计算。
5 数组
AWK提供一维数组来存储字符串和数值。数组和数组元素不需要声明,也不需要指定元素个数。A WK特别之处是数组下标总是字符串型的,所以AWK数组总是关联数组(Associative Arrays),相当于Perl的Hash Array。这一点是AWK区别于C及Perl之处。C的数组下标是整数,Perl分别普通数组和Hash数组。
遍历数组的命令是:
for (variable in array)
statement
注意数组下标的输出次序是依赖于AWK的实现的!
测试数组中是否存在某元素的命令是:
if ( subscript in A )
注意如果用if (A[subscript] == “”) 命令,将可能创建一个新元素!
删除数组元素的命是:delete array[subscript]
用for ( i in array)delete array[i] ; 可以删除所的有元素,但是新版的gawk可以用简单的delete array;命令删除整个数组。
AWK的多维数组是用一维数组来模拟的。比如,可以用
for (i = 1; i<=10; i++)
for (j= 1; j<=10; j++)
arr[i, j ] = 0
if ((i, j) in arr) 方式来使用多维数组。AWK实际用arr[i SUBSEP j]来代替arr[i,j]。
如果要实现多维数组的循环,可以采取以下方式:
for (k in arr) {
split(k, x, SUBSEP)
i=x[1]
j=x[2]
…(i,j)
}
6 操作符
AWK的操作符基本与C语言相同,但也有些例外。按优先级从低至高列表如下:操作符号说明赋值= += -= *= /= %= ^=^=是特别的操作符,C没有
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论