上古神器-AWK中高级实例分享-中
2013-11-05 21:11
225 查看
**《上古神器-AWK中高级实例分享-中》**
本节目录:匹配模式
I. 等于==awk '$1=="sun" {print $0}' file |
awk '$1 ~ /sun/ {print $0}' file |
awk '$2>40' file |
awk 'length($1)>4 && $2>50' file |
awk '/^$/{x++}END{print x}' file |
三元条件表达式
Expr 1? Expr 2: expr 3 三元表达式 awk '{print ($1<$2) ? "true" : "false"}'if (site in dosome || doall ) |
四种书写模式
I,II 两种方式重点掌握 I> awk '{print}' file II> cat b.sh #!/bin/bash awk '{print $0}' file III> awk -f b.awk file cat b.awk: {print} IV> #!/bin/gawk -f BEGIN{filename==ARGV[1]} {print}filename #或者 ARGV[1] |
AWK双/单引号
|
字符串分隔
案例1<index函数>#index 简介è Index(s,t) 返回子串t在字符串s中的位置,如果没有指定s,返回0 ###案例1<index函数>: awk ' BEGIN{ ##定义变量x x="abc def"; ##awk中变量直接引用,无需$引用 part=index(x,"b"); ##打印从b位置开始后的4个字符-包括b位置 print substr(x,part,4) }' 结果: |
函数
a>Getline函数从输入中读取另一行.getline函数不仅能读取正常的输入数据流,而且也能处理来自文件和管道的输入 Getline函数类似awk中的next语句,两者都是导致下一个输入行被读取,next语句将控制传递回脚本的顶部,getline函数得到下一行但没有改变脚本的控制。可能 的返回值如下: 1 如果能够读取一行。 0 如果到了文件末尾 -1 如果遇到错误 注意: getline函数被称为一个函数并且返回了一个值,但他的语法类似于一个语句,不能写成getline(),它的语法不请允许有圆括号。 从文件读取 Getline < “data” ###从文件data中读取一行 BEGIN{ while (1 < 2){ printf "Enter your Name: " getline < "-" } } Getline获取的值赋值为变量 BEGIN{ printf "Enter your name:" getline name < "-" print name } Wrong: Name=getline 从管道中读取输入 “who am i”|getline “date +’%a.,%h%d,%y’” |
Close() 函数用于关闭打开的文件和管道, 1. 每次只能打开一定数量的管道(后面“约束”的章节有介绍为什么会有约束),close()函数关闭一个使用过的管道(通常是getline返回0或者-1的时候) 例: close(“who”) |
System() 函数执行一个表达式给出的命令,它的返回为命令的退出状态.脚本等待这个命令完成任务后才继续执行. 例: BEGIN{ If(system(“mkdir dale”) != 0) Print “Command Failed” } Awk –v comfile=”cup_commands” script - ##-v 可使BEGIN中的参数生效 |
和next语句类似 执行到nextfile时,当前的数据文件被放弃.操作从脚本的顶端开始,并使用下一个文件的第一个记录 |
Function name(parameter-list) { } Parameter-list是逗号分隔变量列表,函数体由一个或者多个语句组成.函数中通常包含一个return语句,用于将控制返回到脚本中调用该函数的位置;它通常用一个表达式来返回一个值,如下所示: Return expression 实例: Function insert(STRING,POS,INS){ Before_tmp=substr(STRING,1,POS) After_tmp=substr(STRING,POS+1) Return before_tmp INS after_tmp } |
数组
a> 数组简介array[index-expression] index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。 要遍历数组中的每一个元素,需要使用如下的特殊结构: for (var in array) { statement1, ... } 其中,var用于引用数组下标,而不是元素值; |
seq 10| awk ' { ##定义数据a,行号为索引 a[NR]=$0 }END{ ##数据元素提取 for(i in a) {print i,a[i]} }'}' seq 10| awk ' { a[NR]=$0 }END{ ##awk下用asort排序,排序的实质是对key求值 b=asort(a); for(i=1;i<=b;i++) ##打印key,value {print i,a[i]} }' |
SUBSEP 多维数组分割符 awk ' BEGIN{ ##二维数组定义 ay[1,10]="a"; ay[10,2]="b"; }END{ for(k in ay) ##二维数组提取(split) {split(k,idx,SUBSEP); print idx[1],idx[2],ay[idx[1],idx[2]];} }' /dev/null |
读取标准输入参数: ARGV 元素个数ARGC,第一个元素下标是0,最后一个是ARGC-1 ENVIRON BEGIN{ for (env in ENVIRON) print env"="ENVIRON[env] } |
Delete acro[acronym] |
下节预告:
**《上古神器-AWK中高级实例分享-下》**
*****建议牢固掌握上/中章后再进行下章的学习*****实战需求: 22求1-100和... 22
打印第一列相同第二列最大值... 22
打印第一列相同值出现次数... 24
两列求最大值... 24
多列求最大值... 25
除第一列外所有值求和... 25
相同列求和... 26
相同字段求最大值最小值,相同字段出现的次数... 27
FNR,NR巧用/不同字段对应列替换... 28
案例分析... 30
apache-log日志分析... 31
知阵转换... 33
行列对调案例分析... 34
相同字段的其它内容放相同行... 35
相同字段的其它内容放相同行且补充字段... 35
Split分割字符串实例... 36
格式化输出... 38
FR,NFR双关联 注册账户统计... 40
统计系统netstat 状态及各状态连接数... 41
******************************************************************************************** 为最大限度不影响读者感官: ** /article/4467743.html另起栏目,也请大家多支持 ******************************************************************************************** |
相关文章推荐
- 页面局部加载,适合Ajax Loading场景(Demo整理)
- xctool
- 《推荐系统实践》 阅读笔记
- SAM4E单片机之旅——5、LED呼吸和PWM
- Expression Blend实例中文教程(4) - 布局控件快速入门Canvas
- 页面局部加载,适合Ajax Loading场景(Demo整理)
- [Unity3d]U3d中基本GUI控件
- 【PS】简单操作
- java socket编程
- [Unity3d]U3d中基本GUI控件
- 管理类
- FZU 2087 统计树边 Kruskal变形求边的数目
- 做到30条业绩翻十倍
- linux安装pylab
- Vlan间路由
- HashMap实现原理分析
- shell模拟seq功能及shellfor循环总结
- uva 11176 - Winning Streak(期望)
- P1092全排列
- codechef (大数据素数筛法)