免费注册 查看新帖 |

Chinaunix

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

请问ad版主一个问题?  关闭 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2004-04-18 18:56 |只看该作者

请问ad版主一个问题?

[quote]原帖由 "admirer"]看起来有点繁琐,暂时还没有想到简化的代码。[/quote 发表:

版主一出手,唉......@_@,惭愧

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
22 [报告]
发表于 2004-04-18 19:09 |只看该作者

请问ad版主一个问题?

[quote]原帖由 "bjgirl"]版主一出手,唉......@_@,惭愧[/quote 发表:

MM过谦了,你的代码常常让鄙人迷途知返!

论坛徽章:
0
23 [报告]
发表于 2004-04-18 19:12 |只看该作者

请问ad版主一个问题?

原帖由 "admirer" 发表:

MM过谦了,你的代码常常让鄙人迷途知返!
没那么过分吧@_@(嘻嘻)

论坛徽章:
0
24 [报告]
发表于 2004-04-18 20:03 |只看该作者

请问ad版主一个问题?

我看明白了,ad的思路太巧妙了,不过我的嘴笨,恐怕解释不清楚。

    首先说一下总体思路,这个算法让保持空间中的内容始终为“...c\nb\na\n”,其中a是第一行不重复的内容,b是第二行不重复的内容,c是第三行不重复的内容,以此类推。每读入一个新行,比方内容是x,把保留空间的内容追加到它后面,并且把一个回车替换为两个回车(为什么要把一个回车变为两个回车,后面再分析),这时模式空间的内容是“x\n\n...c\n\nb\n\na\n\n”。然后根据正则表达式“/^\([ -~]*\n\).*\n\1/”查找是否有相同的行(如何匹配,也留待后面分析),若有则删除模式空间,那么保持空间的内容不变,把模式空间中的两个回车再替换回一个回车后,保存到保持空间,然后打印模式空间中第一个回车前面的内容,也就是新读入的那行。如果新读入的行与前面的重复,那么因为模式空间已经删除,所以就不会打印出来。

    现在说为什么要把一个回车变为两个回车以及如何匹配相同的行。关键在于正则表达式“/^\([ -~]*\n\).*\n\1/”,其中[ -~]表示空格到~符号,它们的ascii码是32到127,表示所有可见字符。为了看得更清楚,这个正则表达式可以改为“/^\(.*\n\).*\n\1/”,效果差不多一样的。这个正则表达式中有个“\(.*\n\)”,表示“后跟一个回车的任意字符”,为描述方便,以m来代表它。表达式中有个“\1”,指代的就是m。若m后面跟着零个或若干个字符,然后发现有“回车+m”这样的内容,说明m出现了至少两次,那么表达式成立,表示新读入的行前面已经出现过了。以sed读到第四行为例,此时模式空间是“2\n\n4\n\n2\n\n1\n\n”,m指代的是“2\n”,后面跟了若干字符后,匹配到“\n2\n”这样的内容,那么“2\n”就是重复的。再以sed读到第6行为例,此时模式空间是“4\n\n4\n\n2\n\n1\n\n”,m指代的是“4\n”,若匹配到“\n4\n”表示这一行重复。要注意如果原文件有空行,这些操作可以避免空行被过滤掉。所以这就是为什么要把一个回车替换为两个回车的原因,就是为了加强匹配。
    现在说说执行过程:

  1. 命令                  模式空间         保持空间          打印
  2. 读入第一行            1
  3. G                              1\n
  4. s/\n/&&/                   1\n\n
  5. /^\([ -~]*\n\).*\1/d  1\n\n
  6. s/\n//                        1\n
  7. h                               1\n                    1\n
  8. P                               1\n                    1\n               1
  9. 读入第二行            2                       1\n
  10. G                               2\n1\n               1\n
  11. s/\n/&&/                    2\n\n1\n\n        1\n                        
  12. /^\([ -~]*\n\).*\1/d  2\n\n1\n\n        1\n                        
  13. s/\n//                        2\n1\n              1\n
  14. h                               2\n1\n              2\n1\n            
  15. P                               2\n1\n              2\n1\n            2
  16. 读入第三行……
  17. 读入第四行            2                       4\n2\n1\n
  18. G                               2\n4\n2\n1\n     4\n2\n1\n
  19. s/\n/&&/                    2\n\n4\n\n2\n\n1\n\n
  20. /^\([ -~]*\n\).*\1/d  空               4\n2\n1\n
  21. s/\n//                        空               4\n2\n1\n
  22. h                               空               4\n2\n1\n
  23. P                               空               4\n2\n1\n         没有打印出内容
  24. ……
复制代码

不知道我讲得是否清楚?

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
25 [报告]
发表于 2004-04-18 21:12 |只看该作者

请问ad版主一个问题?

awk版的,请MM试试
  1. awk '!($0 in a){a[$0];print}'
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
26 [报告]
发表于 2004-04-18 21:30 |只看该作者

请问ad版主一个问题?

[quote]原帖由 "r2007"][/quote 发表:

妙!

论坛徽章:
0
27 [报告]
发表于 2004-04-18 21:30 |只看该作者

请问ad版主一个问题?

[quote]原帖由 "r2007"][/quote 发表:

谢谢,测试通过, (收藏)
btw:请007给大概讲讲吧

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
28 [报告]
发表于 2004-04-18 21:46 |只看该作者

请问ad版主一个问题?

原帖由 "bjgirl" 发表:
谢谢,测试通过, (收藏)
btw:请007给大概讲讲吧
  1. awk '!($0 in a){a[$0];print}'
复制代码

如果$0不是数组a中的下标,则向数组a中增加一个下标为$0的元素,其值无关紧要,然后打印$0.不知我的表达是否清楚?

论坛徽章:
0
29 [报告]
发表于 2004-04-18 22:10 |只看该作者

请问ad版主一个问题?

    
天哪,版主们真是太牛了!!!

论坛徽章:
0
30 [报告]
发表于 2004-04-19 09:30 |只看该作者

请问ad版主一个问题?

[quote]原帖由 "r2007"][/quote 发表:

哎,这就是差距呀!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP