awk解决实际问题例子
awk很有用,就不说了,下面记录几个我遇到的例子,汇总
1 获得linux环境变量(ENVIRON)
awk 'BEGIN{print ENVIRON["PATH"];}' /etc/passwd
结果: /home/homer/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
注: ENVIRON是子典型数组,可以通过对应键值获得它的值,linux 环境变量还有$HOME,$PWD等,可以通过linux 命令 env 查看
2 外部环境变量
awk 'BEGIN{for (i in ENVIRON) {print i"="ENVIRON[i];}}'
结果:
HLVL=1
PWD=/home/homer
JAVA_HOME=/home/homer/eclipse/jdk1.7.0_05
SHELL=/bin/bash
PATH=/home/homer/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
..........
注: ENVIRON是子典型数组,可以通过对应键值获得它的值,linux 环境变量还有$HOME,$PWD等,可以通过linux 命令 env 查看
例1 关于NR和FNR的典型应用(转载):
现在有两个文件格式如下:
#cat account
张三|000001
李四|000002
#cat cdr
000001|10
000001|20
000002|30
000002|15
想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:
张三|000001|10
张三|000001|20
李四|000002|30
李四|000002|15
执行如下代码
#awk -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr
注释:
1 由NR=FNR为真时,判断当前读入的是第一个文件account,然后使用{a[$2]=$0;next}循环将account文件的每行记录都存入数组a,并使用$2第2个字段作为下标引用.
脚本里面的next是指读入下一个输入行,并返回脚本的顶部,即awk -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}',每次都执行到next然后循环执行绿色部分,红色的都不执行。这部分实际的赋值结果是
root.~:awk -F \| 'NR==FNR{a[$2]=$0; print "a("$2")=" ,a[$2];next}' account
a(000001)= 张三|000001
a(000002)= 李四|000002
2 由NR=FNR为假时,判断当前读入了第二个文件cdr,然后跳过{a[$2]=$0;next},对第二个文件cdr的每一行都无条件执行{print a[$1]"|"$2},此时变量$1为第二个文件的第一个字段(即 000001 000002),使用a[$1]引用了步骤1得出的数组,然后随着$1的变化,输出完整的数组
root.~:awk -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr
张三|000001|10
张三|000001|20
李四|000002|30
李四|000002|15
例2 awk 判断 (也可循环,此不表)
首先说下,功能是把a中TIME和b中的TIME相同的OUT_FLOW值加在file1中,并且多加一列,该列值为1(当OUT_FLOW在UP和LOW之间)或0(当OUT_FLOW不在UP和LOW之间) ,a、b中Time不同的不用显示
cat b:
Time Name C_name Up Low
1 dns1 godedy 5 1
2 dns2 dnspod 5 3
3 dns3 na 8 2
5 dns4 cnnc 4 2
cat a:
Time C_name Out_flow
1 dnspod 3
2 godedy 6
3 cnnc 3
4 cnnc 4
root.~:awk 'NR==FNR{Time[$1]=$3} NR>FNR{if (Time[$1]) print $0, Time[$1] }' a b |awk '{if ($6>$5&&$6<$4) print $0,0 ;else print $0,"1"}' >file1
Time Name C_name Up Low Out_flow 0
1 dns1 godedy 5 1 3 0
2 dns2 dnspod 5 3 6 1
3 dns3 na 8 2 3 0
注释:
1 当NR==FNR为真时,执行Time[$1]=$3,依次把a中time的值放入数组Time[$1]=中,此时处理的是文件a
2 当NR>FNR为真时,此时处理的文件是b,执行if (Time[$1]) print $0, Time[$1],这里的if是为了去除存在于b而不存在于a中的Time,此命令把a、b文件Time相同的合并起来,以便下部处理
3 |管道符后面的语句,awk '{if ($6>$5&&$6<$4) print $0,0 ;else print $0,"1"}',判断Out_flow是否介于Low和Up之间,是则为1,否则为0,并打印输出
4 >file1,将结果重定向到文件file1中
参考:
linux shell awk 流程控制语句(if,for,while,do)详细介绍
awk解决实际问题例子的更多相关文章
- 探索Windows命令行系列(6):活用批处理解决实际问题
1.批量修改文件名 2.批量重启服务 3.全盘搜索指定文件 3.1.全盘搜索名称为 mm.jpg 的文件,获取其全路径 3.2.查找系统中所有名称以 .docx 结尾的文件 4.调用可执行程序 4.1 ...
- awk 循环语句例子
awk 循环语句例子 运行结果:
- 运用《深入理解Java虚拟机》书中知识解决实际问题
前言 以前看别人博客说看完<深入理解Java虚拟机>这本书并没有让自己的编程水平提高多少,不过却大大提高了自己的装逼水平.其实,我倒不这么认为,至少在我看完一遍这本书后,有一种醍醐灌顶的感 ...
- iOS正则表达式解决实际问题
问题:上海市徐汇区桂林路158号1202室 字符串长度不固定,数字长度也不固定.截取第二组数字. 方法一:[正则表达式] NSString * str = @"上海市徐汇区桂林路158号12 ...
- 【maven】排除maven中jar包依赖的解决过程 例子:spring cloud启动zipkin,报错maven依赖jar包冲突 Class path contains multiple SLF4J bindings.
一直对于maven中解决jar包依赖问题的解决方法纠结不清: 下面这个例子可以说明一个很简单的解决方法: 项目启动报错: Connected to the target VM, address: '1 ...
- 项目中解决实际问题的代码片段-javascript方法,Vue方法(长期更新)
总结项目用到的一些处理方法,用来解决数据处理的一些实际问题,所有方法都可以放在一个公共工具方法里面,实现不限ES5,ES6还有些Vue处理的方法. 都是项目中来的,有代码跟图片展示,长期更新. 1.获 ...
- C语言复习笔记-17种小算法-解决实际问题
判断日期为一年中的第几天(考虑闰年) 1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且 ...
- [转贴]C语言复习笔记-17种小算法-解决实际问题
判断日期为一年中的第几天(考虑闰年) /* * 计算该日在本年中是第几天,注意闰年问题 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 * 特殊情况,闰年且输入月份大于3时 ...
- 【原创】CMD常用命令:解决实际问题
1.查找某一目录下后缀名文某某的所有文件. 命令格式:dir *.mp3 /a -d/b/s >C:\Users\leemo\Desktop\total.txt MP3为文件后缀名.>是命 ...
随机推荐
- 巧用CSS居中未知高度的块元素
在网页中让一个未知高度的块元素水平垂直居中是一个老生常谈的问题,但是总是有些特殊场景让你无法得心应手的实现居中,本文介绍几种常用的经典的居中方法,总有一种适合你! 1. position .paren ...
- Linux笔记---硬盘添加
BZ创建了一个块云硬盘添加到了虚拟机里,然后按照平时挂在U盘的方式去挂载硬盘: mount -t ext4 /dev/vdb /mnt/xxxx 结果报出以下错误: mount: wrong fs ...
- 什么是TNB?如何买TNB?
我天天在微博上看到有人吹TNB,今天一起来看下它到底是什么玩意? 什么是TNB? Time New Bank (TNB) 旨在打造精淮的时间价值传输网络. 我们高度认可人们时间付出的商业价值,每个 ...
- python之 正则表达式
简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式.Emacs 风格模式可读 ...
- JAVA 将图片转换为Base64编码
这里使用的jar包是commons-codec-1.10.jar; 示例代码 import java.io.FileInputStream; import java.io.FileOutputStre ...
- VirtualBoX虚拟机里安装linux系统,在虚拟系统里安装增强功能报错解决方法
http://www.cnblogs.com/MoShin/archive/2012/04/25/2469156.html 当我们在虚拟机里安装lixunx系统,避免不了的要安装增强功能,无论是视觉效 ...
- React Native学习(一)——搭建开发环境
第一次接触React Native,首先搭建环境,过程还算顺利,不过也遇到了些问题,这里简单记录下来.中文官网(http://reactnative.cn/docs/0.47/getting-star ...
- NOI2017&&codeM2017游记
7.17 坐了一天动车到绍兴,宿舍环境什么的还是很棒的. 7.18 早上开幕式,没啥好看的,例行节目+讲话. 下午笔试,顺利满分,不过ccz挂了一道多选,99分,影响应该不是很大. 练习赛出人意料地没 ...
- UVA 11292 Dragon of Loowater(简单贪心)
Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...
- BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4987 Solved: 1732[Submit][Stat ...