免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求教个awk的问题,烦高手解答 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-27 17:27 |只看该作者 |倒序浏览
本帖最后由 rdcwayx 于 2014-02-28 09:05 编辑

我下面的文件我要按($2大于30小于25)$3 $2 $1的情况显示,$3相同的显示一次,$1要相加,我的代码为什么只显示了ffff的一条记录,怎么改一下?
  1. [root@localhost aaa]# cat a.bak
  2. 12 30 aaa
  3. 15 40 ffff
  4. 45 30 aaa
  5. 41 90 xxxx
  6. 48 40 ffff
  7. 47 35 qqqq
  8. 78 40 ffff
  9. 44 35 qqqq
  10. 16 50 zzzz
  11. 18 40 mmmm
复制代码
  1. [root@localhost aaa]# awk '{if($2>30 || $2<25) print $0}' a.bak |sort |awk '{a[$3]+=$1};END{print $3,$2,a[$3]}'  
  2. ffff 40 141
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2014-02-27 17:37 |只看该作者
根据你的文本,你想得到的结果是怎样的?

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
3 [报告]
发表于 2014-02-27 17:40 |只看该作者
你把 print 放在END里, 当然只print 一条了

论坛徽章:
2
水瓶座
日期:2014-02-28 14:20:09辰龙
日期:2014-06-16 13:18:51
4 [报告]
发表于 2014-02-27 17:57 |只看该作者
回复 1# hejianbu437


    凑合看吧
  1. awk '{if($2>30 || $2<25) print $0}' a.bak |sort |awk 'BEGIN{i=1};{a[$3]=$2;b[$3]+=$1;c[i++]=$3};END{for(j=1;j<=length(a);j++) print c[j]"\t" a[c[j]]"\t" b[c[j]]}'
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
5 [报告]
发表于 2014-02-27 18:18 |只看该作者
本帖最后由 bikkuri 于 2014-02-27 20:30 编辑
  1. root@jinx:/tmp/new# awk '{if($2>30 || $2<25) print $0}' a.bak |sort |awk '{if(a[$3" "$2]==0)b[len++]=$3" "$2;a[$3" "$2]+=$1;};END{for(i=0;i<len;i++)print b[i],a[b[i]]}'
  2. ffff 40 141
  3. zzzz 50 16
  4. mmmm 40 18
  5. xxxx 90 41
  6. qqqq 35 91
  7. root@jinx:/tmp/new#
复制代码

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
6 [报告]
发表于 2014-02-27 18:52 |只看该作者
回复 1# hejianbu437


    目测一下:
  1. awk '$2>30||$2<25{a[$3FS$2]+=$1}END{for(i in a)print i,a[i]}'  urfile
复制代码

论坛徽章:
0
7 [报告]
发表于 2014-02-27 19:04 |只看该作者
本帖最后由 rdcwayx 于 2014-02-28 09:05 编辑

回复 4# rogantianwz

兄弟 这个想办法优化下,你用c[i++]=$3会有问题的,你看下面的a.txt文件你就不行。
  1. [root@localhost tmp]# awk '{if($2>35||$2<30) print $0}' a.txt | sort |awk 'BEGIN{i=1};{a[$3]=$2;b[$3]+=$1;c[i++]=$3};END{for(j=1;j<=length(a);j++) print c[j]"\t" a[c[j]]"\t" b[c[j]]}'
  2. ffff    40      133
  3. zzzz    50      16
  4. mmmm    40      18
  5. ffff    40      133
  6. [root@localhost tmp]# cat a.txt
  7. 12 30 aaa
  8. 15 40 ffff
  9. 45 30 aaa
  10. 41 90 xxxx
  11. 40 40 ffff
  12. 47 35 qqqq
  13. 78 40 ffff
  14. 44 35 qqqq
  15. 16 50 zzzz
  16. 18 40 mmmm
  17. [root@localhost tmp]#
复制代码

论坛徽章:
0
8 [报告]
发表于 2014-02-27 19:06 |只看该作者
本帖最后由 rdcwayx 于 2014-02-28 09:06 编辑

回复 5# bikkuri

这句没搞明白,烦解读下,感谢!
  1. '{if(a[$3" "$2]==0)b[len++]=$3" "$2;a[$3" "$2]+=$1;};
复制代码

论坛徽章:
0
9 [报告]
发表于 2014-02-27 19:10 |只看该作者
本帖最后由 rdcwayx 于 2014-02-28 09:06 编辑

回复 6# 关阴月飞

这句麻烦帮我解释下,感谢:
  1. {a[$3FS$2]+=$1}
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
10 [报告]
发表于 2014-02-27 20:27 |只看该作者
本帖最后由 bikkuri 于 2014-02-27 20:29 编辑

太好理解了啊!这不就是你说的“$3相同的显示一次,$1要相加”嘛!

$3相同的显示一次:if(a[$3" "$2]==0)b[len++]=$3" "$2;
$1要相加:a[$3" "$2]+=$1;};


hejianbu437 发表于 2014-02-27 19:06
回复 5# bikkuri

这句没搞明白,烦解读下,感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP