高级gawk编程
①使用变量
★ 内置变量
★ 用户定义变量
变量 | 描述 |
---|---|
FIELDWIDTHS | 以空格分隔字符,用空格定义每个数据从字段的长度 |
FS | 输入字段分隔符号(原文本中把什么符号当做字段的分隔) |
RS | 输入记录分隔符号(原文本中把什么符号当做一条记录的分隔) |
OFS | 输出字段分隔符号(输出时显示什么符号当做字段的分隔) |
ORS | 输出记录分隔符号(输出时显示什么符号当做一条记录的分隔) |
ARGC | 出现的命令行参数的个数 |
ARGV | 命令行参数数组 |
FNR | 数据文件当前的记录号 |
NR | 已处理的输入记录个数 |
NF | 最后一个数据字段 |
例子:
$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
$ gawk '
> BEGIN {FS=","}
> {print $1,"FNR"="FNR,"NR="NR}
> END{print NR}' data1 data1
data11 FNR=1 NR=1
data21 FNR=2 NR=2
data31 FNR=3 NR=3
data11 FNR=1 NR=4
data21 FNR=2 NR=5
data31 FNR=3 NR=6
6
用户定义的变量需要注意:
★ 不能以数字开头
★ 变量名区分大小写
★ 不需要使用取址符号,直接使用变量名
★ 用 -f 在命令行上设置gawk程序的变量值,用 -v 在命令行上设置gawk程序中BEGIN中的值
例子:
$ cat script
BEGIN{print n}
{print $n}
$ gawk -f script n=3 data1
data13
data23
data33
$ gawk -v script n=3 data1
3
data13
data23
data33
②数组
gawk使用关联数组。格式为:
var[index] = element
var是变量名,index是关联数组的索引值,element是数据元素值,在引用数组变量时,必须包括索引值才能检索相应的数据元素值。
为了方便提取索引值,可以采用for语句:
for (var in array)
{
statements
}
var每次取到的值就是数组array的索引值。
删除数组:
delete array[index]
③使用模式
匹配操作符(~)
例子:
$1 ~ /^data/ #搜索第二个数据段以data开头的记录
$1 ! ~ /^data/ #搜索第二个数据段不是以data开头的记录
`④用户自定义函数
要使用自定函数,格式为:
function name([variable])
{
statements
}
使用自己的函数,例子:
$ gawk '
> function my()
> {
> printf $1
> }
> BEGIN{FS="\n"; RS=""}
> {
> my()
> }' data1
创建函数库
★ 注意在使用时候要包含函数库即可,如下:
$ gawk -f funclib -f script4 data2 #funclib为定义的函数库