最近利用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 的方法,但是我没有试过,所以不在这里列出了。

 

  

  

最新文章

  1. nodejs中流(stream)的理解
  2. miniui后台无法接收到input传值
  3. JointBoost+CRF+GraphCut做手绘草图的分割
  4. asp.net mvc Post上传文件大小限制
  5. 怎么用sql语句查询一个数据库有多少张表
  6. Curl的编译
  7. Eclipse Key Shortcuts for Greater Developers Productivity--reference
  8. Nginx 因 Selinux 服务导致无法远程訪问
  9. 分布式事务实现-Spanner
  10. Everything at Once
  11. java异常——五个关键字(try、catch、finally、throw、throws)
  12. linux连接数过多,导致ping包丢包的问题解析
  13. motor helper
  14. Codeforces Round #427 (Div. 2) Problem C Star sky (Codeforces 835C) - 前缀和
  15. kylin的状态栏(启动器)改成ubuntu之前的样子
  16. AIM Tech Round 3 (Div. 1) (构造,树形dp,费用流,概率dp)
  17. haproxy 学习
  18. 分布式部署下的报表调用 API调用 权限问题以及性能方案
  19. 【Kettle】8、变量参数传递介绍
  20. Vue 学习顺序

热门文章

  1. 【poj1804】 Brainman
  2. Vijos1889 天真的因数分解
  3. HYSBZ 4197 寿司晚宴
  4. 51NOD 1400 序列分解
  5. SPOJ Play on Words
  6. 《驾驭Core Data》 第三章 数据建模
  7. 架构(Architecture)和框架(Framework)杂谈
  8. xml转成数组,原来这么简单!
  9. JDK安装成功了,环境变量也配置好了,测试代码也可以运行,但是打不开eclipse
  10. webservice和restful的区别