免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4049 | 回复: 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
复制代码

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
14 [报告]
发表于 2014-03-02 14:47 |只看该作者
来个perl
  1. perl -lane '$h{$F[2],$F[1]}+=$F[0] if $F[1]>30||$F[1]<25;END{print "$_ $h{$_}" for keys %h}' t
  2. xxxx90 41
  3. qqqq35 91
  4. mmmm15 77
  5. zzzz50 16
  6. ffff40 141
  7. mmmm40 18
复制代码
回复 1# hejianbu437


   

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
13 [报告]
发表于 2014-02-28 10:20 |只看该作者
本帖最后由 damcool 于 2014-02-28 10:24 编辑
  1. sort -k3,3 t1.txt|awk '$2>30||$2<25{if (t!="" && t!=$3) {print t" "r" "s;s=0};s+=$1;r=$2;t=$3}END{print t" "r" "s}'
复制代码

论坛徽章:
2
水瓶座
日期:2014-02-28 14:20:09辰龙
日期:2014-06-16 13:18:51
12 [报告]
发表于 2014-02-28 09:45 |只看该作者
回复 7# hejianbu437
  1. awk '{if($2>35||$2<30) print $0}' a.txt | sort |awk 'BEGIN{i=1};{a[$3]=$2;b[$3]+=$1;};END{for(j in a) print j"\t" a[j]"\t" b[j]}'
复制代码

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
11 [报告]
发表于 2014-02-27 22:12 |只看该作者
本帖最后由 rdcwayx 于 2014-02-28 09:07 编辑
  1. awk '{if($2>30 || $2<25) print $0}' a.bak |sort |awk '{a[$3]+=$1};END{print $3,$2,a[$3]}'  
复制代码
=>
  1. awk '{if($2>30 || $2<25) print $0}' a.bak |sort |awk '{a[$3]+=$1};END{for(i in a)print i,a[i]}'  
复制代码
反正$2你不关心

论坛徽章:
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

这句没搞明白,烦解读下,感谢!

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

回复 6# 关阴月飞

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

论坛徽章:
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
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]#
复制代码

论坛徽章:
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
复制代码
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP