免费注册 查看新帖 |

Chinaunix

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

【请教】cygwin下的awk统计问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-23 21:01 |只看该作者 |倒序浏览
20可用积分
本帖最后由 keke00 于 2010-09-23 22:21 编辑

环境:
  1. $ bash --version
  2. GNU bash, version 3.1.17(6)-release (i686-pc-cygwin)
  3. Copyright (C) 2005 Free Software Foundation, Inc
复制代码
背景:
一文件夹有数千个文件,文件名如下:
0_20100908090020.dat
0_20100909200001.dat
0_20100923180900.dat
........
每个文件650K左右,近8000行
现在想统计每个文件中符合特定字符串的信息

问题:
当输入文件数量接近800,大小接近480MB时,
awk end部分打印两次,如下:

Total:797
F:15
Total:254
F:5

按理只打印一次呀!
个人怀疑是和cygwin的最大存储容量有关
于是修改注册表修改注册表的HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER区段。添加DWORD键
heap_chunk_in_mb
同时用cygwin中的regtool完成该设置。如下:

regtool -i set /HKLM/Software/Cygnus\ Solutions/Cygwin/heap_chunk_in_mb 10240

regtool -v list /HKLM/Software/Cygnus\ Solutions/Cygwin

但问题依旧,请教高手哪里还有问题?


部分代码如下:确定在此时已出问题
  1. ls*.dat | awk -F'[_.]' '$2+0>=201009080000 && $2+0 <=201009250000' | xargs awk '/$2~/EOF/{F++;nextfile}END{printf"\nTotal:%d\n",ARGC-1;printf"EOF:%d\n",F}'
复制代码
代码较少,解释下我本意
ls*.dat | awk -F[_.]  '$2+0>=201009080000 && $2+0 <=201009250000' 找出符合条件的文件,之后在这些文件中查找信息包含EOF的文件数量

论坛徽章:
0
2 [报告]
发表于 2010-09-23 21:32 |只看该作者
ls*.dat | awk -F[_.]  '$2+0>=201009080000 && $2+0 <=201009250000' | xargs awk 'END{printf"\nTotal:%d\n",ARGC-1}'

首先 1)-F[_.] 为啥不用单引号引起来
2) xargs 你确认要这么用?
3) 确认了2 之后你还要用 ARGC的话 为啥不用wc

论坛徽章:
0
3 [报告]
发表于 2010-09-23 21:35 |只看该作者
....-F[_.]是什么意思 ........我看这有点崩溃

论坛徽章:
0
4 [报告]
发表于 2010-09-23 21:37 |只看该作者

  1. ls*.dat | awk -F'_'  '{if($2>=201009080000 && $2<=201009250000)a++}END{print a}'
复制代码
这个就ok了吧减少io

论坛徽章:
0
5 [报告]
发表于 2010-09-23 22:23 |只看该作者
回复 2# nuclearxin


    1)-F[_.] 为啥不用单引号引起来,加单引号最好
已编辑

论坛徽章:
0
6 [报告]
发表于 2010-09-25 15:01 |只看该作者
楼主的意思不是很明白
我的理解是在某个目录下,有很多.dat文件,这些文件中有的包含字符串"eof",你想根据这些dat文件的第二列过滤出一个文件列表,在这个列表中统计包含eof的dat文件的数量。
ls *.dat  | awk -F'[_.]'  '$2+0>=201009080000 && $2+0 <=201009250000' >tmpfile
more a.sh
#!/bin/bash
f=0
for file in `cat /tmp/alen/tee/tmpfile`
  do
     grep -i "eof" $file &>/dev/null
     [ $? = 0 ] && f=$((f+1))
  done
echo $f

论坛徽章:
0
7 [报告]
发表于 2010-09-25 15:13 |只看该作者
回复 1# keke00

try:
    xargs -0


xargs -零

论坛徽章:
0
8 [报告]
发表于 2011-01-12 23:41 |只看该作者
主要问题可能是ls *.dat及xargs两个命令命令行缓冲有限制,文件数量较大时不能在命令行用通配符,也不要用xargs.
下面代码调试通过,应该符合楼主要求:

  1. ls | awk -F'[_.]' '
  2. BEGIN{countf=eoff=0;}
  3. $2+0>=201009080000 && $2+0 <=201009250000 && $3=="dat" && NF==3{
  4. countf++;FS="[ \t]+";fname=$0;
  5. while (1==getline<fname){
  6.   if($2~"EOF"){
  7.    eoff++;break;
  8.   }
  9. };
  10. close(fname);
  11. FS="[_.]";
  12. }
  13. END{
  14.   print "\nTotal:,",countf,"EOF:",eoff;
  15. }'
复制代码


下面带调试语句的(去掉#)脚本,并先生成调试数据后测试:
  1. echo "1

  2. 2 EOF">0_200009080900.dat
  3. echo "2" >1_200009080900.dat
  4. echo "1
  5. 2
  6. 3
  7. 3 EOF">2_201009080010.dat
  8. echo "4" >3_201009080030.dat
  9. echo "4" >4_201009080020.dat
  10. echo "4" >5_201109080020.dat
  11. ls | awk -F'[_.]' '
  12. BEGIN{countf=eoff=0;}
  13. #{print "#0",NR,$0}
  14. $2+0>=201009080000 && $2+0 <=201009250000 && $3=="dat" && NF==3{
  15. countf++;
  16. FS="[ \t]+";
  17. fname=$0;
  18. # print "#1",$0,countf,eoff,fname;
  19. while (1==getline<fname){
  20. # print "#2",$0,countf,eoff,fname;
  21. if($2~"EOF"){
  22. eoff++;
  23. # print "#3",$0,countf,eoff,fname;
  24. break;
  25. }
  26. };
  27. close(fname);
  28. FS="[_.]";
  29. }
  30. END{
  31. print "\nTotal:,",countf,"EOF:",eoff;
  32. }'
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
9 [报告]
发表于 2011-01-13 00:17 |只看该作者
接在xargs后面,被分两次执行,这个太正常不过了。
参数再长,也有个容限。xargs会帮你分的
$ seq 1 10000|xargs echo | wc -l
1
$ seq 1 100000|xargs echo | wc -l
5

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2011-01-13 00:20 |只看该作者
可以这样,在后面再加一个管道,再接一个awk来最终统计一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP