两个文件去重的N种姿势
2024-08-26 15:44:19
最近利用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 的方法,但是我没有试过,所以不在这里列出了。
最新文章
- nodejs中流(stream)的理解
- miniui后台无法接收到input传值
- JointBoost+CRF+GraphCut做手绘草图的分割
- asp.net mvc Post上传文件大小限制
- 怎么用sql语句查询一个数据库有多少张表
- Curl的编译
- Eclipse Key Shortcuts for Greater Developers Productivity--reference
- Nginx 因 Selinux 服务导致无法远程訪问
- 分布式事务实现-Spanner
- Everything at Once
- java异常——五个关键字(try、catch、finally、throw、throws)
- linux连接数过多,导致ping包丢包的问题解析
- motor helper
- Codeforces Round #427 (Div. 2) Problem C Star sky (Codeforces 835C) - 前缀和
- kylin的状态栏(启动器)改成ubuntu之前的样子
- AIM Tech Round 3 (Div. 1) (构造,树形dp,费用流,概率dp)
- haproxy 学习
- 分布式部署下的报表调用 API调用 权限问题以及性能方案
- 【Kettle】8、变量参数传递介绍
- Vue 学习顺序