免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk 两个小程序,求大虾解释 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-05 07:01 |只看该作者 |倒序浏览
初来乍到,问好

不太懂awk,获两个蛮好用的小程序,不懂不敢用
大虾,给通俗解释下吧
awk '
BEGIN {FS=OFS=" "}
{
sum=0; n=0
for(i=3;i<=NF;i++)
     {sum+=$i; ++n}
     print $0,"sum:"sum,"count:"n,"avg:"sum/n
}' file

好像是每行末尾会有均值和总和。。。但我BEGIN {FS=OFS=" "} 和这个print $0,"sum:"sum,"count:"n,"avg:"sum/n
整体思路也不太清晰

awk 'FNR==1 {file_num++}; {a[$1,$2,file_num]=$3;key[$1,$2]=$1OFS$2;}; END{for(k in key){printf("%s"OFS, key[k]); for(i=1; i<=file_num;  ++i){printf("%d"OFS, a[k,i])}printf("\n")}}' *

还有这个
grep text ${array_list[$index]} | awk '$2 >= 0 && $2 <= 73' | awk '{sum=sum+$3} END {print sum/73}'

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2014-08-05 08:23 |只看该作者
不懂不敢用

这些代码很安全,不会造成数据丢失,放心大胆的做测试吧。

论坛徽章:
0
3 [报告]
发表于 2014-08-05 09:23 |只看该作者
Shell_HAT 发表于 2014-08-05 08:23
这些代码很安全,不会造成数据丢失,放心大胆的做测试吧。


谢谢,人家想了解下 思路,

特别是 第2个,和天书一样。。。

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
4 [报告]
发表于 2014-08-05 21:33 |只看该作者
回复 1# zhxftj


    awk菜鸟来尝试解释下,不对之处请指正。

1.BEGIN中设置输入、输出分隔符均为空格, 后面的for循环汇总第三个域开始到最后一个域的总和,个数,并计算平均值。

  1. $ awk '{sum=0;n=0; for(i=3;i<=NF;i++){sum+=$i;++n} print $0,"sum:"sum,"count:"n,"avg:"sum/n}' num2.txt
  2. 1 2 3 5 6 sum:14 count:3 avg:4.66667
  3. 1 2 4 3 8 9 10 100 sum:134 count:6 avg:22.3333
  4. 1 2 3 9 sum:12 count:2 avg:6
  5. 1 2 3 2 sum:5 count:2 avg:2.5
  6. 1 2 4 1 sum:5 count:2 avg:2.5
  7. 1 2 5 sum:5 count:1 avg:5

复制代码
2.这个应该是前两列原样输出,第三列开始根据文件数目补零(如果共有N个文件,那么第1个文件的4~N域为0,第2个文件的3以及5~N域为0,以此类推)。并且输出顺序与原文件顺序不再一致。

  1. $ cat 1.txt
  2. a b 11 d
  3. b c 12 e
  4. c d 13 f
  5. d e 14 g
  6. $ cat 2.txt
  7. 1 2 21 4
  8. 2 3 22 5
  9. 3 4 23 6
  10. 4 5 24 7
  11. 5 6 25 8
  12. 6 7 26 9
  13. $ cat 3.txt
  14. A B 31 D E F
  15. B C 32 E F G
  16. C D 33 F G H
  17. $ awk 'FNR==1 {file_num++}; {a[$1,$2,file_num]=$3;key[$1,$2]=$1OFS$2;}; END{for(k in key){printf("%s"OFS, key[k]); for(i=1; i<=file_num;  ++i){printf("%d"OFS, a[k,i]);}printf("\n")}}' *.txt
  18. a b 11 0 0
  19. C D 0 0 33
  20. 6 7 0 26 0
  21. A B 0 0 31
  22. 4 5 0 24 0
  23. 2 3 0 22 0
  24. d e 14 0 0
  25. b c 12 0 0
  26. B C 0 0 32
  27. 5 6 0 25 0
  28. 3 4 0 23 0
  29. 1 2 0 21 0
  30. c d 13 0 0

复制代码
3.第三个比较简单,就是在$2属于0~73时,汇总$3,并求对73的平均数。不过,我很奇怪为什么后面要写两个awk,直接一个不就行了吗?

另外,建议lz不明白的话,可以实际运行测试一下,我现在也在学习中,上面是我测试的结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP