免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dlms
打印 上一主题 下一主题

请教一个文件处理的问题,grep根25和70有没有啥关系? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-05-23 10:20 |只看该作者
原帖由 dlms 于 2007-5-23 10:13 发表

我觉得我描述的很清除啊,主要是文件太大了是个日志怎么帖呢。



我感慨昨天...

论坛徽章:
1
射手座
日期:2013-09-30 15:24:05
22 [报告]
发表于 2007-05-23 10:24 |只看该作者
原帖由 Edengundam 于 2007-5-23 10:20 发表



我感慨昨天...

论坛徽章:
0
23 [报告]
发表于 2007-05-23 10:48 |只看该作者
原帖由 dlms 于 2007-5-23 06:58 发表
问题是我将近300多个文件,统计出来的结果不是70就25,我晕了。
这个是交易日志,不可能的啊


看你的程序,就是$1, 那么,你的300个文件,不用循环,怎么处理的?
我的意思是,你出来的70这个数,实际上是最后一个文件的统计数?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
24 [报告]
发表于 2007-05-23 10:56 |只看该作者
你的疑惑:grep是否有次数限制?
答案:没有。
斑竹已经告诉你grep -f的方法,所以换掉你的n个grep吧。有时候冗长的机械劳动让人疲惫,容易出些低级错误,不必再深究了,浪费别人也浪费自己的宝贵时间。^_^

论坛徽章:
0
25 [报告]
发表于 2007-05-23 10:57 |只看该作者
cardno.file 是进行匹配的帐号文件, 一个帐号一行, 注意最后一行请留一个空行.
条件过滤在# check filter condition注释下面一行, 可以根据情况调整.
data那里, 可以支持多个文件.
返回结果为ok: cardno或者failed: cardno.
根据你情况怎么玩都可以了.


  1. #!/bin/sh

  2. awk 'BEGIN {
  3. RS = "-+\n";
  4. FS = "\n";
  5. while (getline < "cardno.file")
  6.         card_hash[$0] = "true";
  7. }
  8. {
  9.     for (i = 1; i <= NF; i++)
  10.         {
  11.                 if (split($i, tmp, ":|:") == 2)
  12.                 {
  13.                         hash[tmp[1]] = tmp[2];
  14.                 }

  15.         }
  16.         # check filter condition
  17.         if (hash["cardno"] in card_hash && hash["stat"] == "success" && hash["tx
  18. kind"] == "取款")
  19.                 printf("ok:%s\n", hash["cardno"]);
  20.         else
  21.                 printf("failed:%s\n", hash["cardno"]);
  22. }
  23. ' data

复制代码

论坛徽章:
1
射手座
日期:2013-09-30 15:24:05
26 [报告]
发表于 2007-05-23 10:59 |只看该作者
原帖由 woodie 于 2007-5-23 10:56 发表
你的疑惑:grep是否有次数限制?
答案:没有。
斑竹已经告诉你grep -f的方法,所以换掉你的n个grep吧。有时候冗长的机械劳动让人疲惫,容易出些低级错误,不必再深究了,浪费别人也浪费自己的宝贵时间。^_^

我换掉了没有问题,我就是不明白为啥都敲出来会根直接用文件查不一样呢?
我在测试下,谢谢提醒。呵呵

论坛徽章:
1
射手座
日期:2013-09-30 15:24:05
27 [报告]
发表于 2007-05-23 11:02 |只看该作者
原帖由 Edengundam 于 2007-5-23 10:57 发表
cardno.file 是进行匹配的帐号文件, 一个帐号一行, 注意最后一行请留一个空行.
条件过滤在# check filter condition注释下面一行, 可以根据情况调整.
data那里, 可以支持多个文件.
返回结果为ok: cardno或者fa ...

佩服:em11:

论坛徽章:
0
28 [报告]
发表于 2007-05-23 11:04 |只看该作者
原帖由 dlms 于 2007-5-23 11:02 发表

佩服:em11:



先测结果, 我只能根据你数据文件中2条, 构造一部分测试例子^^
原来数据文件中一个小空格字符都会引起错误, 但是解决办法就是干掉首尾空白字符, 我觉得也不是很难. ^^

论坛徽章:
0
29 [报告]
发表于 2007-05-23 14:04 |只看该作者
说一下我的思路:
awk 'BEGIN{FS="\n";RS="--------";OFS="|"}{if ( $0 ~ /stat:SUCCESS/ && $0 ~ /txkind:取款/ ) print $4' filename1>tmp
大致这样,取出需要统计的字段,这里是使用第四个即cardno:xxxxxx字段。
然后再把tmp和测试帐号文件一起联合使用awk进行统计。
因为不知道你要统计的具体内容,故没有写出来。

[ 本帖最后由 welcome008 于 2007-5-23 14:16 编辑 ]

论坛徽章:
0
30 [报告]
发表于 2007-05-23 16:34 |只看该作者
try。。貌似需要 gawk

  1. awk '
  2. function getFieldValue(pField, i){
  3.        
  4.         for (i = 1; i < NF; i++) if ($i == pField) return $(i+1);
  5.         return 0;
  6. }

  7. function initCardTable(){
  8.         while ((getline < "cards.dat") > 0) specialCards[$0]++;
  9. }

  10. BEGIN {
  11.         RS="\n--*"; ORS="\n-------"; FS="[:\n]";
  12. }

  13. {
  14.         specialCards[123456]++;

  15.         if (getFieldValue("stat") == "success" &&
  16.                 getFieldValue("txkind") == "取款" &&
  17.                 specialCards[getFieldValue("cardno")]) print;
  18. }' urfile
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP