最近利用shell帮公司优化挖掘关键词的流程,用shell替代了多个环节的操作,极大提高了工作效率。

shell在文本处理上确有极大优势,比如多文本合并、去重等,但是最近遇到了一个难搞的问题,即两个大数据量文件去重。

有txt文件A.txt和B.txt。

其中A为关键词和搜索量,以逗号分隔,约90万行。

B为关键词,约400万行。

需要从A中找出与B重复的关键词。

我试了N种姿势,但结果都不尽人意,最奇怪的是有些方法对小数据量的测试文件有用,一旦用在A与B上就会失败,真叫人百思不得其解。

姿势一:

awk -F, '{print $1}' A >keywords.txt
cat keywords.txt B.txt | sort | uniq -d

#先从A.txt种取出关键词,然后与B.txt一起打开,用sort排序,uniq -d 取出重复的行

姿势二:

awk -F, '{print $1}' A >keywords.txt
#照例先取出关键词

comm -1 -2 keywords.txt B.txt
#利用comm命令,显示两个文件都存在的行

姿势三:

awk -F, '{print $1}' A >keywords.txt
for i in `cat keywords.txt`
do
    A=`egrep -c "^$i$" B.txt`
    if [ $A != 0 ]
    then
        echo $i >>重复关键词.txt
    fi
done

#这种姿势就稍微复杂点
#首先取出关键词,然后利用for循环逐个去B.txt里面匹配(注意正则写法^$i$),如果匹配到的结果数不为0,说明这个关键词是重复的,然后输出
#这种方法的优点是稳妥,缺点是效率太TM低了,90万个词逐一与400万词匹配,shell默认又没有多线程,耗时太长。

姿势四:

awk -F, '{print $1}' A >keywords.txt
cat keywords.txt B.txt | awk '!a[$1]++'

#这个方法的原理其实我不太懂,awk命令实在太强大太高深了,但是这种方法又简洁又快速

其实还有一种grep -v 、grep -f 的方法,但是我没有试过,所以不在这里列出了。

 

  

  

两个文件去重的N种姿势的更多相关文章

  1. thinkphp 的两种建构模式 第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用。第二种架构模式两个单入口文件,分别生成两个应用定义define。。。函数可以定义配置文件。。。。

    thinkphp 的两种建构模式  第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用. ...

  2. python打开文件的N种姿势

    # python打开文件的N种姿势 print('[1]使用open()函数+简单for循环') f1 = open('python.txt') for line in f1: print(line. ...

  3. 又拍云张聪:OpenResty 动态流控的几种姿势

    2019 年 1 月 12 日,由又拍云.OpenResty 中国社区主办的 OpenResty × Open Talk 全国巡回沙龙·深圳站圆满结束,又拍云首席架构师张聪在活动上做了< Ope ...

  4. Shell 命令行求两个文件每行对比的相同内容

    Shell 命令行求两个文件每行对比的相同内容 遇到的一个实际问题是,2017年08月01日起,所有未经实名的域名,全部停止解析.而我手上有不少域名,其中很多都是没有实名的.但我不知道哪些实名了,哪些 ...

  5. FastDFS结合FastDHT实现文件去重存储

    存储文件时,为了节省存储空间,需要实现文件去重,即同一份文件只在服务器上存储一份.一种实现是文件上传后先落到应用服务器上,计算MD5并存储到数据库中,然后决定是否上传存储服务器.这样做的缺点是应用服务 ...

  6. SpringBoot系列教程web篇Servlet 注册的四种姿势

    原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势 前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Serv ...

  7. python HelloWorld 的 4 种姿势,你知道几种

    安装完 Python 之后该干啥,当然是要 say HelloWorld 了. python.exe 就是个普通程序 和其它所有命令一样,在命令行中敲下 python 并回车的时候,操作系统去 PAT ...

  8. List集合对象去重及按属性去重的8种方法-java基础总结系列第六篇

    最近在写一些关于java基础的文章,但是我又不想按照教科书的方式去写知识点的文章,因为意义不大.基础知识太多了,如何将这些知识归纳总结,总结出优缺点或者是使用场景才是对知识的升华.所以我更想把java ...

  9. diff 比较两个文件的差异

    功能:比较两个文件的差异,并把不同地方的信息显示出来.默认diff格式的信息. diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件.也使用patch命令对 ...

随机推荐

  1. SpringMVC配置

    博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 4  文章- 1  评论- 0  搭建springmvc框架的另一种思路 在一个完整的项目里搭建springmvc框架的时候, 通常情况下,初学者 ...

  2. 最新版本的DBCP数据源配置

    弄了我一下午,把该加的包都加进去了还是没用,后来把DBCP的包打开来看看才发现路径不对.配置如下: <!-- 使用dbcp配置数据源 --> <bean id="dataS ...

  3. HDU 2255 奔小康发大财

    传送门 Solution: KM算法 关于KM算法有一篇极好的文档http://www.cse.ust.hk/~golin/COMP572/Notes/Matching.pdf Implementat ...

  4. javascript-如何判断一个对象为数组

    Q:如何判断一个对象是否为数组? A1:判断对象的constructor是否指向Array, 接着判断对应的特殊属性,如length,splice之类.这个很容易冒充. A2:使用instanceof ...

  5. 修改eclipse/MyEclipse中包的显示结构为树形

    在右上边三角那里进去设置 选第一个是显示完整的包名,第二个显示的是树形结构,我们一般用第一种,如下图:

  6. ECSHOP去版权标志删除Powered by ECShop(转)

    ECSHOP去版权标志删除Powered by ECShop ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2013-11-11   各位ECSHOP网店系统用户大家好 ...

  7. VS2013配置Caffe卷积神经网络工具(64位Windows 7)——准备依赖库

    VS2013配置Caffe卷积神经网络工具(64位Windows 7)--准备依赖库 2014年4月的时候自己在公司就将Caffe移植到Windows系统了,今年自己换了台电脑,想在家里也随便跑跑,本 ...

  8. php闭包支持

    匿名函数提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它.声明一个匿名函数是这样: $func = function() { }; //带结束符 可以看到 ...

  9. Bootstrap 新手学习笔记——布局组件

    1.字形图标: <button type="button" class="btn btn-primary btn-lg" style="font ...

  10. JS 键值对

    function Map() { this.keys = new Array(); this.data = new Array(); //添加键值对 this.set = function (key, ...