免费注册 查看新帖 |

Chinaunix

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

[文本处理] 找出b文件中有而a文件中没有 [复制链接]

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
11 [报告]
发表于 2013-11-20 16:30 |只看该作者
回复 9# yestreenstars

如果我理解的没错的话, 你需要 grep '<' 或 '>' , 看实际的需求. 然后, 再去掉前面的 '>' 或 '<'.
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
12 [报告]
发表于 2013-11-20 16:38 |只看该作者
回复 11# q1208c
呵呵,那你就应该把grep的命令也提供给楼主,再说说效率问题吧,你加上这个grep命令后还觉得效率比单用grep高吗?

   

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
13 [报告]
发表于 2013-11-20 16:40 |只看该作者
回复 10# q1208c


    表示diff之前还要sort   diff之后还要grep   这个才是硬伤呀

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
14 [报告]
发表于 2013-11-20 16:43 |只看该作者
回复 10# q1208c


    grep的-F选项就是disable regex的

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
15 [报告]
发表于 2013-11-20 16:53 |只看该作者
回复 14# Shell_HAT

跟 regex 无关的.

举个例子.

  1. filea
  2. --------------
  3. adfafad
  4. fa
  5. dfadf
  6. asdfa
  7. df
  8. adf
  9. adf
  10. asd
  11. fads
  12. fdas
  13. fd
  14. asf
  15. dasf
  16. das
  17. fasd
  18. fd
  19. asfd
  20. asf
  21. asaa
  22. dsf
  23. ad
  24. fas
  25. dfd
  26. asf
  27. fasd
  28. fd
  29. asf
  30. dasf
  31. das
  32. fdsa
  33. ----------

  34. fileb
  35. ----------
  36. ad
  37. f
  38. adfa
  39. dfwe
  40. adfa
  41. sd
  42. --------
复制代码
以我对 grep的理解, 它应该是用b中每一行做为一个表达式, 去a中遍历.  那么, a应该被遍历6次.

如果用diff, 一次就够了. 虽然前面有 sort的过程, 但sort的算法已经很高效了, 而且, 文件越大, 效率越明显.
当然, 在现在这个例中的文件里, 完全看不出效率问题, 但随着文件的行数越来越多, 效率问题就越来越大.


当然了, 如果grep是把整个b文件当做一个大的表达式, 只遍历一次a, 那效率就不是问题了. 只是, 不知道当b大到内存都放不下时, grep如何处理.

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
16 [报告]
发表于 2013-11-20 17:04 |只看该作者
回复 13# 关阴月飞

diff 之后的 grep 只有一个 表达式, '<' 或是 '>' . 总好过 原来 b文件中的一堆吧.

另外, 这个方法我在一个有130行的b文件和30w行的a文件中试过了.

开始也是用 grep, 10分钟没有结果. 后来, 才sort了之后 diff的. 而且, 我当时还是先执行了 awk 取了a中的一个字段. 几秒钟就有结果了.
   

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
17 [报告]
发表于 2013-11-20 17:33 |只看该作者
回复 16# q1208c


我用一个100万行的文件和一个100行的文件做的测试:

test1.sh 内容如下:
  1. #!/bin/bash
  2. for((i=1;i<=100;i++)); do
  3.     tr -cd "[:alnum:]" < /dev/urandom | head -c ${1-10}
  4.     echo
  5. done
复制代码
生成一个100行的临时文件:
  1. ./test1.sh > a.txt
复制代码
test2.sh 内容如下:
  1. #!/bin/bash
  2. for((i=1;i<=10000;i++)); do
  3.     cat a.txt
  4. done
复制代码
生成一个100万行的文件:
  1. ./test2.sh > b.txt
复制代码
生成一个100行的文件:
  1. head -90 b.txt > c.txt
  2. head -10 /etc/passwd >> c.txt
复制代码
[root]# time grep -vxFf b.txt c.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:

real    0m0.139s
user    0m0.126s
sys     0m0.009s


[root]# time diff b.txt c.txt | grep '^>' | sed 's/^> //'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:

real    0m0.932s
user    0m0.691s
sys     0m0.033s

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
18 [报告]
发表于 2013-11-20 17:42 |只看该作者
本帖最后由 关阴月飞 于 2013-11-20 17:43 编辑

回复 16# q1208c


    grep 10分钟没结果, sort 后diff 几秒钟出来了? 表示不可思议,于是测试了一下,

sort+diff  和 grep 的方法各连续运行三次:
  1. [root@pf]# du -h 1.txt 2.txt
  2. 37M     1.txt
  3. 37M     2.txt
  4. [root@pf]# wc -l 1.txt 2.txt
  5. 4950001 1.txt
  6. 4950001 2.txt
  7. 9900002 总用量
  8. [root@pf]# head 1.txt 2.txt
  9. ==> 1.txt <==
  10. 3207273
  11. 2785529
  12. 4967878
  13. 3343435
  14. 1677145
  15. 2165230
  16. 2680247
  17. 3019757
  18. 4536182
  19. 3434759

  20. ==> 2.txt <==
  21. 26993
  22. 4123253
  23. 1573704
  24. 3903709
  25. 4632523
  26. 1516950
  27. 795944
  28. 2690009
  29. 3428094
  30. 1619066
  31. [root@pf]# time { sort 1.txt >1.sort; sort 2.txt >2.sort; diff 1.sort 2.sort |grep -E '<|>' >sort_file; }

  32. real    0m59.639s
  33. user    0m56.452s
  34. sys     0m2.931s
  35. [root@pf]# time { sort 1.txt >1.sort; sort 2.txt >2.sort; diff 1.sort 2.sort |grep -E '<|>' >sort_file; }

  36. real    0m59.963s
  37. user    0m55.910s
  38. sys     0m3.412s
  39. [root@pf]# time { sort 1.txt >1.sort; sort 2.txt >2.sort; diff 1.sort 2.sort |grep -E '<|>' >sort_file; }

  40. real    0m59.646s
  41. user    0m55.578s
  42. sys     0m3.577s
  43. [root@pf]# time { grep -vxFf 1.txt 2.txt >grep_file ;grep -vxFf 2.txt 1.txt >>grep_file; }               

  44. real    0m51.941s
  45. user    0m51.144s
  46. sys     0m0.671s
  47. [root@pf]# time { grep -vxFf 1.txt 2.txt >grep_file ;grep -vxFf 2.txt 1.txt >>grep_file; }

  48. real    0m51.890s
  49. user    0m51.174s
  50. sys     0m0.707s
  51. [root@pf]# time { grep -vxFf 1.txt 2.txt >grep_file ;grep -vxFf 2.txt 1.txt >>grep_file; }

  52. real    0m51.941s
  53. user    0m51.227s
  54. sys     0m0.706s
  55. [root@pf]# wc -l sort_file grep_file
  56.   89172 sort_file
  57.   89172 grep_file
  58. 178344 总用量
  59. [root@pf]#
复制代码

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
19 [报告]
发表于 2013-11-20 18:05 |只看该作者
本帖最后由 q1208c 于 2013-11-20 18:14 编辑

回复 18# 关阴月飞

  1. [user@host ~/temp/test.v06p]
  2. $ wc -l *.txt
  3. 2346447 1.txt
  4.   700000 2.txt
  5. 3046447 total

  6. [user@host ~/temp/test.v06p]
  7. $ time { sort 1.txt >1.sort; sort 2.txt >2.sort; diff 1.sort 2.sort |grep -E '<|>' >sort_file; }

  8. real        0m11.898s
  9. user        0m9.020s
  10. sys        0m0.615s

  11. [user@host ~/temp/test.v06p]
  12. $  time { grep -vxFf 1.txt 2.txt >grep_file ;grep -vxFf 2.txt 1.txt >>grep_file; }

  13. real        0m18.300s
  14. user        0m13.692s
  15. sys        0m0.869s
复制代码

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
20 [报告]
发表于 2013-11-20 19:26 |只看该作者
回复 19# q1208c


    正如测试结果所示,两种方法差距并不大......   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP