免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk如何计算多个文件? [复制链接]

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

先有多个日志文件 在 /log目录下

0416.log  0419.log  0422.log  0425.log  0428.log  0501.log  0504.log  0507.log
0417.log  0420.log  0423.log  0426.log  0429.log  0502.log  0505.log  0508.log
0418.log  0421.log  0424.log  0427.log  0430.log  0503.log  0506.log  0509.log

我想计算每个文件中百度蜘蛛访问的最后一列的平均值;

grep Baiduspider 0416.log | awk '{sum+=$NF} END {print "平均下载耗时=", sum/NR}'


这个是单个文件的计算!

如何批量计算???  更高效些,求大神解答~

输出时 一行对应一个文件,如下

0416 平均下载耗时 1000.98ms
0417 平均下载耗时 1000.98ms
0418 平均下载耗时 1000.98ms

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
2 [报告]
发表于 2013-05-14 20:14 |只看该作者
  1. for i in $(ls *.log); do grep baiduspaider $i|后边一样;done
复制代码

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2013-05-15 08:40 |只看该作者
awk '/Baiduspider/{sum+=$NF} END {print "平均下载耗时=", sum/NR}' *.log

论坛徽章:
0
4 [报告]
发表于 2013-05-15 10:57 |只看该作者
回复 3# waker


    谢谢!!

不过计算出来 是全部加在一起的平均值;

求 、log下 批量计算 *.log 每一个文件的平均值
并输出如1楼的结果..
可实现?

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
5 [报告]
发表于 2013-05-15 10:59 |只看该作者
本帖最后由 rdcwayx 于 2013-05-15 13:00 编辑
  1. for file in *.log
  2. do
  3.   awk '/Baiduspider/{sum+=$NF} END {split(FILENAME,a,".");print a[1] , "平均下载耗时=", sum/NR}' $file
  4. done
复制代码

论坛徽章:
0
6 [报告]
发表于 2013-05-15 13:54 |只看该作者
回复 5# rdcwayx


    谢谢版主,很靠谱;由于用 awk /Baiduspider/ 匹配数据会有些出入,我还是改成grep这个样子了
  1. #!/bin/bash
  2. for file in *.log
  3. do
  4.   grep Baiduspider $file | awk  '{sum+=$NF} END {split(FILENAME,a,".");print a[1] , "平均下载耗时=", sum/NR}'
  5. done
复制代码
输出的结果文件名 输不出来了

输出是这样的..
- 平均下载耗时= 1022.36
- 平均下载耗时= 1032.55
- 平均下载耗时= 1018.06
- 平均下载耗时= 899.111
- 平均下载耗时= 864.094
- 平均下载耗时= 787.369
- 平均下载耗时= 801.767
- 平均下载耗时= 797.103
- 平均下载耗时= 801.994
- 平均下载耗时= 766.501


求用grep 能输出文件名!如下,学艺不精,打扰你们了,非常谢谢LS的大神们

0416 平均下载耗时= 797.103
0417  平均下载耗时= 801.994
0418 平均下载耗时= 766.501
....

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
7 [报告]
发表于 2013-05-15 14:38 |只看该作者
  1. [seesea@UC xx]$ ls
  2. aaa.log  bbb.log

  3. [seesea@UC xx]$ head *
  4. ==> aaa.log <==
  5. Baiduspider 1
  6. xxx 2
  7. Baiduspider 3
  8. xxx 4

  9. ==> bbb.log <==
  10. xxx 1
  11. Baiduspider 2
  12. xx 3
  13. Baiduspider 50

  14. [seesea@UC xx]$ awk '/Baiduspider/ {name=FILENAME; sub(/.log/, "", name); count[name]++; sum[name] += $NF} END{for(i in sum) print i "平均下载耗时=", sum[i]/count[i]}' *.log
  15. aaa平均下载耗时= 2
  16. bbb平均下载耗时= 26
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
8 [报告]
发表于 2013-05-15 14:40 |只看该作者
回复 6# zeikong


    你这里 grep 输出以后用管道传给 awk,所以 awk 是得不到文件名的。除非你把文件名弄成输出的内容给 awk 解析啦,否则这个文件名就是 -.

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
9 [报告]
发表于 2013-05-15 14:42 |只看该作者
回复 6# zeikong


    版主的那个出入是用了 NR 来做为平均值计算的除数了,这个 NR 包括非 baiduspider 行的计数。而你在前面 grep 后,NR 就是只包括匹配行的计数,所以两者的结果有不同。我这里另外增加一个数组进行匹配行计数就避免了这个问题。

论坛徽章:
0
10 [报告]
发表于 2013-05-15 15:41 |只看该作者
本帖最后由 meteorcan 于 2013-05-15 15:49 编辑
  1. #/bin/bash

  2. flist=`find -name *.log`

  3. for i in $flist
  4. do      grep Baiduspider $i | awk '{sum+=$NF} END {print "平均下载耗时=", sum/NR}
  5. done
复制代码
写了一个脚本,flist是保存你那个目录下文件名称的列表,不知道对不对。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP