免费注册 查看新帖 |

Chinaunix

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

帮我看一下这个awk脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-24 16:32 |只看该作者 |倒序浏览
我有两个文件,一个是标准文件a.txt(正确的文件),另外还有一个b.txt,现在就是要拿b.txt 和 a.txt对比,如果a.txt中的每条记录都在b.txt中存在,则我们认为是b.txt是正确的。在比较时,我只需要比较其中的两个字段就行了($3 and $4).
我写了如下的awk脚本

$cat check.awk
{ aline=$0
  field3=$3
  field4=$4
  count=0;
   { while ( getline line < "b\.txt" > 0 )
       split(line, lines)
        count++
       {  if ( field3 == lines[3] && field4 == lines[4] )
               break   #如果找到相等的,则说明a.txt的当前这条数据找到,因此要退出循环
          else if ( count == 124 ){
               print aline #如果当读到第124条数据时还没有找到,则认为这条数据在b.txt中不存在,因此输出,以便以后插入
               close("cnos_dmnsn_correct") #关掉当前的文件流,以使下次从文件b.txt的开头开始读入
          }
               
       }
  }
}

但运行老是不行,while循环每次读入的都是b.txt的最后一行,还请各位大虾指点一下。谢了

论坛徽章:
0
2 [报告]
发表于 2006-10-24 16:42 |只看该作者
提供两个文件:
a.txt                                                             b.txt                     
CON        1 000000100        82063161  | CON 1 000000100        82063161
CON        1 000000101        82063156  | CON 1 000000101        82063156
CON        1 000000102        82063142  | CON 1 000000102        82063142
CON        1 000000103        82063177  | CON 1 000000103        82063177
CON        1 000000104        82063199  | CON 1 000000104        82063199
CON        1 000000105        82063249  | CON 1 000000105        82063249
CON        1 000000110        82063079  | CON 1 000000110        82063079
CON        1 000000111        82063132  | CON 1 000000111        82063132
CON        1 000000112        000009889 |               

这种情况下,  CON        1 000000112        000009889 就会输出,因为在b.txt里面找不到对应的记录

[ 本帖最后由 JasonSei 于 2006-10-24 16:44 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-10-24 16:49 |只看该作者
diff -w a.txt b.txt 这样不好?

论坛徽章:
0
4 [报告]
发表于 2006-10-24 16:52 |只看该作者

回复 1楼 JasonSei 的帖子

因为getline这个函数就是读取下一行,但是,读取完后不会回到文件的开始。所以你文件a.txt中的第一条记录查询完后,getline已经处于文件的末尾,所以,后面的始终读入最后一行。

试试用next进行控制。

论坛徽章:
0
5 [报告]
发表于 2006-10-24 17:07 |只看该作者
原帖由 awk就是awp加ak 于 2006-10-24 16:49 发表
diff -w a.txt b.txt 这样不好?



这个方法是很简单,但如果两个文件的数据顺序不一样, 分析结果比较麻烦.

论坛徽章:
0
6 [报告]
发表于 2006-10-24 17:09 |只看该作者
sort ?

论坛徽章:
0
7 [报告]
发表于 2006-10-24 17:11 |只看该作者
原帖由 hebioldman 于 2006-10-24 16:52 发表
因为getline这个函数就是读取下一行,但是,读取完后不会回到文件的开始。所以你文件a.txt中的第一条记录查询完后,getline已经处于文件的末尾,所以,后面的始终读入最后一行。

试试用next进行控制。


close("cnos_dmnsn_correct") #关掉当前的文件流,以使下次从文件b.txt的开头开始读入,我有Close文件流,为什么还这样?我也试着把这个语句放在while外面,但还是不行。

论坛徽章:
0
8 [报告]
发表于 2006-10-24 17:13 |只看该作者
原帖由 awk就是awp加ak 于 2006-10-24 17:09 发表
sort ?

先sort, 在diff 应该行的,但我的awk为什么不行,有点想不明白,还请指点一下。

论坛徽章:
0
9 [报告]
发表于 2006-10-24 17:18 |只看该作者
代码还我不熟悉
while循环每次读入的都是b.txt的最后一行

不大清楚这句的意思?

论坛徽章:
0
10 [报告]
发表于 2006-10-24 17:40 |只看该作者
你的最终目的是不是判断是:b的数据是不是正确吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP