第22章 gawk进阶

来源:互联网 发布:手写图片识别软件 编辑:程序博客网 时间:2024/04/30 13:22

22.1 使用变量

22.1.1 内建变量
1 字段和记录分隔符变量
这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述

2 数据变量
这里写图片描述

ARGC和ARGV变量允许从shell中获得命令行参数的总数以及它们的值。
这里写图片描述

ENVIRON变量使用关联数组来提取shell环境变量。
这里写图片描述

NF变量可以让你在不知道具体位置的情况下指定记录中的最后一个数据字段。
这里写图片描述

FNR变量含有当前数据文件中已处理过的记录数。
NR变量则含有已处理过的记录总数。
这里写图片描述

22.1.2 自定义变量
1 在脚本中给变量赋值
这里写图片描述
赋值语句还可以包含数学算式来处理数字值。
这里写图片描述

2 在命令行上给变量赋值
这里写图片描述

-v选项运行在BEGIN代码之前设定变量
这里写图片描述

22.2 处理数组
gawk编程语言使用关联数组提供数组功能。用各种字符串来引用值。

22.2.1 定义数组变量
赋值变量格式:
var[index] = element
这里写图片描述

22.2.2 遍历数组变量
for (var in array)
{
statemetns
}
这里写图片描述

22.2.3 删除数组变量
delete array[index]
这里写图片描述

22.3 使用模式
22.3.1 正则表达式
这里写图片描述

22.3.2 匹配操作符
匹配操作符允许将正则表达式限定在记录中的特定数据字段。匹配操作符是波浪线(~)。可以指定匹配操作符、数据字段变量以及要匹配的正则表达式。
$1 ~ /^data/
这里写图片描述

22.3.3 数学表达式
这里写图片描述

22.4 结构化命令
22.4.1 if语句
if (condition)
statement1

if (condition) statement1
这里写图片描述

22.4.2 while语句
while(condition)
{
statements
}
这里写图片描述
gawk编程语言支持在while循环中使用break语句和continue语句,允许你从循环中跳出。
这里写图片描述

22.4.3 do-while语句

22.5 格式化打印
printf命令的格式:(和c语言用法一样)
printf “format string”,var1,var2 …
format string会用文本元素和格式化指定符来具体指定如何呈现格式化输出。

格式化指定符采用如下格式:
%[modifier]control-letter

gawk ‘BEGIN{
x = 10 * 100
printf “The answer is: %e\n”, x
}’

3中修饰符:
*width : 指定了输出字段最小宽度的数字值
*prec:指定浮点数中小数点后面位数
-(减号):指明在向格式化空间中放入数据时采用左对齐而不是右对齐。

gawk ‘BEGIN{FS=”\n”,RS=”“}{printf “%-16s %s\n”,1,4}’ data2

22.6 内建函数

22.6.1 数学函数

22.6.2 字符串函数

22.6.3 时间函数

22.7 自定义函数

22.7.1 定义函数
function name([variables])
{
statements
}

22.7.2 使用自定义函数
gawk ’
function myprint()
{
printf “%-16s - %s\n”,1,4
}
BEGIN{FS=”\n”;RS=”“}
{
myprint()
}
’ data2

22.7.3 创建函数库

cat funclib
function myprint()
{
printf “%-16s - %s\n”,1,4
}
cat script4
BEGIN{ FS=”\n”; RS=”“}
{
myprint()
}
gawk -f funclib -f script4 data2

22.8 实例

cat scores.txt
Rich Blum,team1,100,115,95
Barbara Blum,team1,110,115,100
Christine Bresnahan,team2,120,115,118
Tim Bresnahan,team2,125,112,116

cat bowling.sh

!/bin/bash

for team in (gawkF,print$2scores.txt|uniq)dogawkvteam=team ‘BEGIN{FS=”,”;total=0}
{
if(2==team)  
        {  
            total +=
3 + 4+5;
}
}
END {
avg = total / 6;
print “Total for”,team,”is”,total,”,the average is”,avg
}’scores.txt
done

22.9 小结

第24章 编写简单的脚本使用工具

0 0
原创粉丝点击