免费注册 查看新帖 |

Chinaunix

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

请教awk的容错机制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-27 14:55 |只看该作者 |倒序浏览
最近遇上一个问题,查询记录的时候,总是会遇上特殊的太长的纪录行,用nawk分割时有如下错误提示

nawk: input record `E,W,227837997,10,1,8...' too long
input record number 3.16714e+07
source line number 15

这样的话总是导致nawk查询到该行就中断,因此,该行之后的纪录就无法继续查询,这给我造成很大困扰,请问有没有什么用法可以使nawk在某行出错后还能继续之后的行呢?

论坛徽章:
0
2 [报告]
发表于 2006-06-27 16:55 |只看该作者
试试awk呢?

论坛徽章:
0
3 [报告]
发表于 2006-06-29 12:17 |只看该作者
一样的,没有办法解决吗,郁闷阿

论坛徽章:
0
4 [报告]
发表于 2006-06-29 12:21 |只看该作者
Ex:
    if(NF>100)getline;

论坛徽章:
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
5 [报告]
发表于 2006-06-29 12:22 |只看该作者
RS=","
把域变成记录处理试试

论坛徽章:
0
6 [报告]
发表于 2006-06-29 19:30 |只看该作者
Ex:
    if(NF>100)getline;
————————————
试验过了,不行,因为那一行太长,超出awk的处理范围,它无法解析这行有几个字段


RS=","
把域变成记录处理试试
————————————
不是很理解,但我觉得也不行,因为要处理的记录有很多行,以“,”为记录分割符没法做我想要的操作,比如每行第6个字段

论坛徽章:
0
7 [报告]
发表于 2006-06-29 21:01 |只看该作者
那就处理前先把这行给喀嚓了  所以长行都喀嚓了

论坛徽章:
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
8 [报告]
发表于 2006-06-29 21:24 |只看该作者
比如每行第6个字段
这个找不到么?
如果RS=,
就是第6个记录和在EOF前每个从含\n记录开始数的第6个记录

还是那句名言:shell版90%的问题都是逻辑问题,跟shell基本无关

论坛徽章:
0
9 [报告]
发表于 2006-06-29 21:32 |只看该作者
谢谢帮忙,但问题还是存在


那就处理前先把这行给喀嚓了  所以长行都喀嚓了
——————————————————————
因为不知道哪行会太长,除了长以外没有其它特征,无法先删除该行



比如每行第6个字段
这个找不到么?
如果RS=,
就是第6个记录和在EOF前每个从含\n记录开始数的第6个记录
————————————————————————————
相同错误,那太长的行就是因为有个字段太长导致的,用,作记录分割符并不能把该字段变短,还是提示记录太长退出.....

论坛徽章:
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
10 [报告]
发表于 2006-06-30 08:53 |只看该作者
请问你是如何测试的呢?RS是在读入行以前设置的么?下面是我的测试
文件中有2行,每行有10万个用,分割的小数
测试机器是128Mpc133内存的菜羊,好像没费多大劲

  1. [waker@proxy dd3]$ seq -s, 0 0.1 100000 >file
  2. [waker@proxy dd3]$ seq -s, 100000 -0.1 0 >>file
  3. [waker@proxy dd3]$ wc  file
  4.        2        2 15377805 file
  5. [waker@proxy dd3]$ time awk 'BEGIN{RS=","}
  6. > NR==6
  7. > /\n/{print NR}' file
  8. 0.5
  9. 1000000
  10. 1999999

  11. real    0m7.624s
  12. user    0m7.171s
  13. sys     0m0.157s
复制代码


如果对awk没信心,可以换perl试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP