免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-20 11:28 |只看该作者 |倒序浏览
a和b文件的内容大致如下且经过!a[$0]++去重:
1031878416
2011187736
1020032987
1003585075
2018336682
2022934236

进过如下处理后为什么c+a总条数不等于b文件的总条数?
awk 'NR==FNR{array[$0]++}NR>FNR{if(!(array[$0]))print}' a b > c

# wc -l a
16489 a
# wc -l b
1405763 b
# wc -l c
1389522 c

论坛徽章:
7
亥猪
日期:2013-10-10 17:00:29辰龙
日期:2013-10-12 16:23:19卯兔
日期:2013-11-18 17:01:27金牛座
日期:2014-09-09 10:17:052015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之柏太阳神
日期:2015-09-25 13:56:42数据库技术版块每日发帖之星
日期:2016-08-06 06:20:00
2 [报告]
发表于 2013-11-20 11:36 |只看该作者
  1. cat b a a | sort | uniq -u > c

  2. awk 'NR==FNR{a[$0]=1;next}{if(! a[$0])print}' a b
复制代码

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
3 [报告]
发表于 2013-11-20 11:37 |只看该作者
本帖最后由 Herowinter 于 2013-11-20 11:39 编辑

感觉这是个数学集合论的问题
集合a  3个元素{a,b,c}
集合b  3个元素{b,c,d}
集合c(b中有a中没有) 1个元素{d}
集合a+c 4个元素{a,b,c,d}

a+c元素个数4不等于b中元素个数3。

论坛徽章:
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
4 [报告]
发表于 2013-11-20 12:18 |只看该作者
  1. [root@localhost ~]# head a b
  2. ==> a <==
  3. 1
  4. 2
  5. 3

  6. ==> b <==
  7. 2
  8. 3
  9. 4
  10. [root@localhost ~]# awk 'NR==FNR{a[$0];next}!($0 in a)' a b > c
  11. [root@localhost ~]# wc -l a b c
  12. 3 a
  13. 3 b
  14. 1 c
  15. 7 总用量
  16. [root@localhost ~]#
复制代码

论坛徽章:
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
5 [报告]
发表于 2013-11-20 13:42 |只看该作者
回复 1# 一轮秋影
如果只是要找出b中有a中没有的, awk并不合适, 原因是内存占用. 可以试一下 sort和 diff

sort a > a.sort
sort b > b.sort

diff b.sort a.sort > c

由于 diff 只会输出不同的部分, 只要根本你处需要把 '>' 或是 '<' 的行打出来, 就是你想要的了.

   

论坛徽章:
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
6 [报告]
发表于 2013-11-20 13:45 |只看该作者
回复 5# q1208c
  1. grep -vxFf a b
复制代码
  1. grep -vxFf 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
7 [报告]
发表于 2013-11-20 16:18 |只看该作者
回复 6# Shell_HAT


这样不行的, 我试过了.

如果两个文件很大的话, 会非常的慢.

在大文件的时候, diff 之后再处理, 是效率最好的.

论坛徽章:
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
8 [报告]
发表于 2013-11-20 16:27 |只看该作者
回复 7# q1208c


你测试的文件是多大的?
sort + diff 和 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
9 [报告]
发表于 2013-11-20 16:28 |只看该作者
回复 5# q1208c
  1. [root@localhost ~]# cat a
  2. 1
  3. 2
  4. 3
  5. [root@localhost ~]# cat b
  6. 2
  7. 3
  8. 4
  9. [root@localhost ~]# sort a > a.sort
  10. [root@localhost ~]# sort b > b.sort
  11. [root@localhost ~]# diff a.sort b.sort > c
  12. [root@localhost ~]# cat c
  13. 1d0
  14. < 1
  15. 3a3
  16. > 4
  17. [root@localhost ~]#
复制代码
你确定这结果是楼主想要的吗?

   

论坛徽章:
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
10 [报告]
发表于 2013-11-20 16:29 |只看该作者
回复 8# Shell_HAT


   
几百M 吧 .

diff 的效率当然高了. 原因很简单, diff不用遍历. 只要不同, 就可以 next 了. 而 grep不行. 必须用每个 regex 去遍历文件. 就算正则效率再高, 也没办法解决这么大量的重复操作呀.


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP