awk之选择性打印
时间:2011-02-17
来源:互联网
本帖最后由 yinyuemi 于 2011-02-17 11:10 编辑
最近的帖子中有不少是关于选择性打印的,自认为用awk来处理这样的文本是有很大的优势,而且很容易理解。
在处理这类问题时,可以通过设置一些变量作为打印标签,达到选择的目的。
另,还可以利用awk自身的函数如NF,RS,RT,FS等,有时会达到意想不到的效果。
下面是就自己的一些理解做了下总结,如有不对之处,望不吝指正!
1. 按照某个pattern取其前后几行数据:
复制代码
1.1 pattern等于ddd时,取其前1行:
复制代码
如果是取其前n行,需要借助下数组,以前3行为例
复制代码
1.2 pattern等于ddd时,取其后n行,这个就要简单的多,以后3行为例
复制代码
这就可以用awk实现,grep -A /grep -B 的功能。
1.3 如果对pattern出现的次数有要求时,第二次匹配aaa时取后2行
复制代码
2. 按照某2个pattern,取其间数据
复制代码
如,匹配取匹配bbb和fff之间的数据
2.1 包括匹配行
复制代码
2.2 不包括bbb行
复制代码
2.3 不包括fff行
复制代码
2.4 不打印匹配行
复制代码
3. 删除或保留含有某个pattern的数据块,看个实例吧:
复制代码
要求是保留从START 到 END 之间含有(VI0)的数据。
代码1:
复制代码
这段代码将打印标签(p)作为数据下标,把每段从START到END之间数据存入数组中,最后打印匹配(VIO)的数组值。
代码2:
复制代码
这段代码巧妙地利用awk的内置函数RS。
<未完>
最近的帖子中有不少是关于选择性打印的,自认为用awk来处理这样的文本是有很大的优势,而且很容易理解。
在处理这类问题时,可以通过设置一些变量作为打印标签,达到选择的目的。
另,还可以利用awk自身的函数如NF,RS,RT,FS等,有时会达到意想不到的效果。
下面是就自己的一些理解做了下总结,如有不对之处,望不吝指正!
1. 按照某个pattern取其前后几行数据:
- cat file
- aaa
- bbb
- ccc
- ddd
- eee
- fff
- ggg
- hhh
- awk '!/ddd/{m=$0}/ddd/{print m}' file
- ccc
- $ awk '{a[NR]=$0}/ddd/{p=NR}END{for(i=p-3;i<p;i++) printf a[i] RS}' file
- aaa
- bbb
- ccc
- awk '/ddd/{p=1;x=NR}p&&NR-x<=3&&NR-x>0' file
- eee
- fff
- ggg
1.3 如果对pattern出现的次数有要求时,第二次匹配aaa时取后2行
- cat file
-
- aaa
- bbb
- ccc
- aaa
- 111
- 222
- aaa
- 333
- 444
-
- awk '/aaa/{m++;x=NR}m==2&&NRx<=2 && NR-x>0' file
- 111
- 222
- cat file
- aaa
- bbb
- ccc
- ddd
- eee
- fff
- ggg
- hhh
2.1 包括匹配行
- awk '/bbb/{p=1}/fff/{print;p=0}p' file
- bbb
- ccc
- ddd
- eee
- fff
- awk '/bbb/{p=1;next}/fff/{print;p=0}p' file
- ccc
- ddd
- eee
- fff
- awk '/bbb/{p=1}/fff/{p=0}p' file
- bbb
- ccc
- ddd
- eee
- awk '/bbb/{p=1;next}/fff/{p=0}p' file
- ccc
- ddd
- eee
- cat file
-
- DFDG
- START
- DSFDS
- DSDS
- XXX
- END
- AADD
- START
- SDSD (VIO)
- FGFG
- END
- START
- DSFDS
- DSDS
- XXX
- END
- START
- adad (VIO)
- gfthgh
- END
代码1:
- awk '/START/{p++}/./{a[p]=a[p]"\n"$0}END{for(i=1;i<=p;i++) if(a[i]~/\(VIO\)/) print a[i]}' file
-
- START
- SDSD (VIO)
- FGFG
- END
-
- START
- adad (VIO)
- gfthgh
- END
代码2:
- awk -v RS="START" '/VIO/{print RS $0}' file
- START
- SDSD (VIO)
- FGFG
- END
-
- START
- adad (VIO)
- gfthgh
- END
<未完>
作者: yinyuemi 发布时间: 2011-02-17
回复 yinyuemi
学习~~
学习~~
作者: 好看的附件 发布时间: 2011-02-17
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28