免费注册 查看新帖 |

Chinaunix

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

[文本处理] 请教一个脚本思路 [复制链接]

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

Dear all,

现在有5个文本文件,分别为aa bb cc dd ee,在同一目录下。每个文本里记录了一堆数字,格式如下:

00 01 02 03 04
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
...

现在我想做一个操作,将每个文本里的第三列累加后求平均值。但是前提是先要做一下判断,判断这几个文件(aa bb cc dd ee)是否存在。

我现在的思路如下:
  1. loglist="
  2. aa
  3. bb
  4. cc
  5. dd
  6. ee
  7. "

  8. for file in $loglist
  9. do
  10.     if [ -e $file ]; then
  11.         count=`cat $file | wc -l`
  12.         total=`cat $file | awk '{sum+= $3}; END{print sum}'`
  13.         avrage=`echo "$count $total" | awk '{printf "%.2f",$1/$2}'`
  14.         echo $avrage
  15.     else
  16.         echo "$file not exits"
  17.     fi
  18. done
复制代码
这样输出的结果是:
aa第三列平均数
bb第三列平均数
cc第三列平均数
dd第三列平均数
ee第三列平均数

而我想输出的结果是:
五个文件总的第三列平均数

请问该如何修改?? 或者有没有更好的思路。
求解

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
2 [报告]
发表于 2014-10-21 16:48 |只看该作者
awk 'b+=$3;a[$3]++;END{print b/a[$3]}' file1 file2 file3 file4 file5

论坛徽章:
0
3 [报告]
发表于 2014-10-21 17:08 |只看该作者
chengchow 发表于 2014-10-21 16:48
awk 'b+=$3;a[$3]++;END{print b/a[$3]}' file1 file2 file3 file4 file5


多谢大牛提供简便方法

有没有可以顺着我思路的方法

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
4 [报告]
发表于 2014-10-21 18:11 |只看该作者
既然每个文件的平均数都能求出来了,五个平均数相加再除以5不是总共第三列的平均数吗?回复 3# cook_xia


   

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
5 [报告]
发表于 2014-10-21 18:52 |只看该作者
回复 2# chengchow
你的不对吧 a[$3]++  那不是第三列的总数吧  是某一个以第三列数字为数组的总数

   

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
6 [报告]
发表于 2014-10-21 19:24 |只看该作者
本帖最后由 wiliiwin 于 2014-10-21 19:25 编辑

回复 1# cook_xia
  1. awk '{b+=$3}END{print b/NR}' 29.txt 30.txt 31.txt 32.txt 33.txt
  2. 17
复制代码
29  30 31  32  33的文本内容都是下面的内容
  1. more 29.txt
  2. 00 01 02 03 04
  3. 10 11 12 13 14
  4. 20 21 22 23 24
  5. 30 31 32 33 34
复制代码

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
7 [报告]
发表于 2014-10-22 08:56 |只看该作者
回复 5# wiliiwin
没测试,本来打算用数组做的,中途改了,就是个计数
awk '{b+=$3;a++}END{print b/a}' file
你的那个做法更加简洁


   

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
8 [报告]
发表于 2014-10-22 09:23 |只看该作者
本帖最后由 欧阳西风 于 2014-10-22 09:23 编辑

回复 3# cook_xia


    这个用awk来做当然是最方便的,参见6楼代码,如果你要想按照自己的思路改的话,可以这么来(完全按照你的代码)

  1. loglist="
  2. aa
  3. bb
  4. cc
  5. dd
  6. ee
  7. "

  8. countsum=0
  9. totalsum=0
  10. for file in $loglist
  11. do
  12.     if [ -e $file ]; then
  13.         count=`cat $file | wc -l`
  14.         total=`cat $file | awk '{sum+= $3}; END{print sum}'`
  15.         # avrage=`echo "$count $total" | awk '{printf "%.2f",$2/$1}'`
  16.         let countsum+=count
  17.         let totalsum+=total
  18.     else
  19.         echo "$file not exits"
  20.     fi
  21. done

  22. avrage=`echo "$countsum $totalsum" | awk '{printf "%.2f",$2/$1}'`
  23. echo $avrage
复制代码

论坛徽章:
0
9 [报告]
发表于 2014-10-22 09:37 |只看该作者
回复 8# 欧阳西风

如果是浮点数,用let就报错了。有好的解决办法吗


   

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
10 [报告]
发表于 2014-10-22 10:37 |只看该作者
回复 9# cook_xia
用bc


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP