免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 18033 | 回复: 11
打印 上一主题 下一主题

awk命令汇总(合并,交集,累加) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-06 09:33 |只看该作者 |倒序浏览
本帖最后由 怿_mao44 于 2012-03-06 13:30 编辑

这段时间多亏大家的帮助,利用awk命令解决了很多问题,在此也总结自己实际运用到的问题,方便其他童鞋一起学习shell。

问题一:
如果两个文件行数相同,只是希望逐行合并
方法一
  1. $ paste -d "\t" file_1 file_2
复制代码
方法二
  1. $ awk 'NR==FNR{a[NR]=$0;nr=NR;}NR>FNR{print a[NR-nr]"\t"$0}' file_1 file_2
复制代码
方法三
  1. $ awk '{getline f2 < "file_2"; print $0"\t"f2}' file_1
复制代码
问题二:
两个文件之间单纯求记录交集
方法一(需要先去除重复记录,两个文件的格式必须相同,尤其要注意每行结尾的空格,换行符)
  1. $ sort file_1 file_2 |uniq -d
复制代码
方法二(file_1大于file_2的记录数,不适合记录过多的文件,也需要提前去重复)
  1. $ grep -w -f file_1 file_2|sort|uniq
复制代码
两种方法可以一起用,从而检查结果是否准确
方法三(如果需要匹配超过两个的文件,就修改“==2”的数值为文件个数)
  1. $ awk '!b[$1,ARGIND]++{if(++a[$1]==2)print}' file_1 file_2
复制代码
问题三:
累加第二列的数值
方法一(无条件累加)
  1. $ awk '{a=a+$2}END{print a}'  file
复制代码
方法二(若第三列的内容相同,则累加对应记录的第二列数值)
  1. awk '{a[$3]+=$2}END{for(i in a) printf "%s\t %d\n",i,a[i]}' file
复制代码
方法三(对其他列的内容进行限制筛选以后累加第二列的数值)
  1. $ awk '$4=="abc" && $5>=100 && $6<=500{a=a+$2}END{print a}' file
复制代码
方法四(若第三列,第四列内容相同,则累加第二列的数值,并将结果升序输出)
  1. $ awk '{a[$3,"\t",$4]+=$2}END{for(i in a)printf "%s\t %d\n",i,a[i]}' file|sort
复制代码

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
2 [报告]
发表于 2012-03-06 09:55 |只看该作者
学习!

论坛徽章:
0
3 [报告]
发表于 2012-03-06 10:00 |只看该作者
回复 2# zhaopingzi


    别笑话我的了。。我这也是想给和我一样才开始学习shell的新手看看,谈不上有什么难点重点学习的呢。。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2012-03-06 10:18 |只看该作者
恩,可以从简单的代码中慢慢学习awk,也是可以的

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2012-03-06 11:32 |只看该作者
本帖最后由 jason680 于 2012-03-06 11:33 编辑

回复 1# 怿_mao44

问题一:
如果两个文件行数相同,只是希望逐行合并

还可用getline....文档很大时 a[NR]=$0 会是问题...

$ awk '{getline f2 < "file_2"; print $0,f2}' file_1

论坛徽章:
0
6 [报告]
发表于 2012-03-06 13:00 |只看该作者
回复 5# jason680


    谢谢补充噢,已经试过,确实很好用,这就添加上去的呢。。

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
7 [报告]
发表于 2012-03-06 13:55 |只看该作者

论坛徽章:
0
8 [报告]
发表于 2012-03-07 23:35 |只看该作者
支持总结帖!

论坛徽章:
0
9 [报告]
发表于 2012-03-07 23:36 |只看该作者
回复 7# ziyunfei


    fuck,你这啥啊……

论坛徽章:
0
10 [报告]
发表于 2012-03-07 23:54 |只看该作者
围观7楼
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP