首页 > 其他 > 详细

awk解决实际问题例子

时间:2015-10-07 20:20:28      阅读:255      评论:0      收藏:0      [点我收藏+]

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 awk 内置变量实例

linux awk命令详解

linux shell awk 流程控制语句(if,for,while,do)详细介绍

AWK的NR和FNR详解(例子1)

awk应用(例2)

awk解决实际问题例子

原文:http://www.cnblogs.com/lizhaoxian/p/4859138.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!