- 成立则执行对应动作里面的内容
- 读取下一行,循环判断
- 直到读取到最后一个文件的结尾
第三篇:awk数组与语法一、awk数组
1.1 数组结构
文章插图
people[police]=110
people[doctor]=120
[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";print word[0],word[1]}'credit easy[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";for(i in word)print word[i]}'crediteasy1.2 数组分类
索 引数组:以数字为下标
关联数组:以字符串为下标
1.3 awk关联数组
现有如下文本,格式如下:即左边是随机字母,右边是随机数字, 即将相同的字母后面的数字加在一起,按字母的顺序输出
a 1b 3c 2d 7b 5a 3 g 2f 6以$1为下标,创建数组a[$1]=a[$1]+$2(a[$1]+=$2)然后配合END和for循环输出结果:
[root@creditease awk]# awk '{a[$1]=a[$1]+$2}END{for(i in a)print i,a[i]}' jia.txt a 4b 8c 2d 7f 6g 2注意:for(i in a) 循环的顺序不是按照文本内容的顺序来处理的,排序可以在命令后加sort排序1.4 awk索引数组
以数字为下标的数组 seq生成1-10的数字,要求只显示计数行
[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR;i+=2){print a[i]}}'13579seq生成1-10的数字,要求不显示文件的后3行
[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR-3;i++){print a[i]}}'1234567解析:改变i的范围即可,多用于不显示文件的后几行1.5 awk数组实战去重
a++ 和 ++a
[root@creditease awk]# awk 'BEGIN{print a++}'0[root@creditease awk]# awk 'BEGIN{print ++a}'1[root@creditease awk]# awk 'BEGIN{a=1;b=a++;print a,b}'2 1[root@creditease awk]# awk 'BEGIN{a=1;b=++a;print a,b}'2 2注:都是 b = a+1b=a++ 先把 a 的值赋予b,然后 a + 1b=++a 先执行a+1,然后把a的值赋予b对一下文本进行去重处理 针对第二列去重
[root@creditease awk]# cat qc.txt 2018/10/20 xiaoli 133733050252018/10/25 xiaowang 177122159862018/11/01 xiaoliu 18615517895 2018/11/12 xiaoli 133733050252018/11/19 xiaozhao 155120132632018/11/26 xiaoliu 186155178952018/12/01 xiaoma 169655645252018/12/09 xiaowang 177122159862018/11/24 xiaozhao 15512013263解法一:[root@creditease awk]# awk '!a[$2]++' qc.txt 2018/10/20 xiaoli 133733050252018/10/25 xiaowang 177122159862018/11/01 xiaoliu 18615517895 2018/11/19 xiaozhao 155120132632018/12/01 xiaoma 16965564525解析:!a[$3]++是模式(条件),命令也可写成awk '!a[$3]=a[$3]+1{print $0}' qc.txta[$3]++ ,“++”在后,先取值后加一!a[$3]=a[$3]+1:是先取a[$3]的值,比较“!a[$3]”是否符合条件(条件非0),后加1注意:此方法去重后的结果显示的是文本开头开始的所有不重复的行解法二:[root@creditease awk]# awk '++a[$2]==1' qc.txt 2018/10/20 xiaoli 133733050252018/10/25 xiaowang 177122159862018/11/01 xiaoliu 18615517895 2018/11/19 xiaozhao 155120132632018/12/01 xiaoma 16965564525解析:++a[$3]==1是模式(条件),也可写成a[$3]=a[$3]+1==1即只有当条件(a[$3]+1的结果)为1的时候才打印出内容++a[$3] ,“++”在前,先加一后取值++a[$3]==1:是先加1,后取a[$3]的值,比较“++a[$3]”是否符合条件(值为1)注意:此方法去重后的结果显示的是文本开头开始的所有不重复的行解法三:[root@creditease awk]# awk '{a[$2]=$0}END{for(i in a){print a[i]}}' qc.txt2018/11/12 xiaoli 133733050252018/11/26 xiaoliu 186155178952018/12/01 xiaoma 169655645252018/12/09 xiaowang 177122159862018/11/24 xiaozhao 15512013263解析:注意此方法去重后的结果显示的是文本结尾开始的所有不重复的行1.6 awk处理多个文件(数组、NR、FNR)
使用awk取file.txt的第一列和file1.txt的第二列然后重定向到一个新文件new.txt中
[root@creditease awk]# cat file1.txt a bc de fg hi j[root@creditease awk]# cat file2.txt 1 23 45 67 89 10[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2}' file1.txt file2.txt a 2c 4e 6g 8i 10解析:NR==FNR处理的是第一个文件,NR!=FNR处理的是第二个文件.注意:当两个文件NR(行数)不同的时候,需要把行数多的放前边.解决方法:把行数多的文件放前边,行数少的文件放后边.把输出的结果放入一个新文件new.txt中:[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2>"new.txt"}' file1.txt file2.txt [root@creditease awk]# cat new.txt a 2c 4e 6g 8i 101.7 awk分析日志文件,统计访问网站的个数
[root@creditease awk]# cat url.txt http://www.baidu.comhttp://mp4.video.cnhttp://www.qq.comhttp://www.listeneasy.comhttp://mp3.music.comhttp://www.qq.comhttp://www.qq.comhttp://www.listeneasy.comhttp://www.listeneasy.comhttp://mp4.video.cnhttp://mp3.music.comhttp://www.baidu.comhttp://www.baidu.comhttp://www.baidu.comhttp://www.baidu.com[root@creditease awk]# awk -F "[/]+" '{h[$2]++}END{for(i in h) print i,h[i]}' url.txtwww.qq.com 3www.baidu.com 5mp4.video.cn 2mp3.music.com 2www.crediteasy.com 3
推荐阅读
- 算法一看就懂之「 堆栈 」
- Android视频技术探索之旅:美团外卖商家端的实践
- 孕妇瑜伽要注意什么?
- 哪些茶称之为绿茶?
- 汽车之家|技术工程师的金三银四,没有消失
- 跑步之前吃什么好
- 武夷岩茶的闻香之法
- 茶之雅趣投茶介绍
- 国医大师何任的茶疗养生之道
- 新疆安集海大峡谷 被称为无人之境场面震撼