两个文件去重的N种姿势

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

 

  

  

时间: 2024-08-05 20:25:04

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

python打开文件的N种姿势

# python打开文件的N种姿势 print('[1]使用open()函数+简单for循环') f1 = open('python.txt') for line in f1: print(line.strip()) f1.close() print('分隔符'.center(40,'-')) print('[2]使用open()函数打开+逐行读取并打印') f2 = open('python.txt') while True: line = f2.readline().strip() # f1

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

存储文件时,为了节省存储空间,需要实现文件去重,即同一份文件只在服务器上存储一份.一种实现是文件上传后先落到应用服务器上,计算MD5并存储到数据库中,然后决定是否上传存储服务器.这样做的缺点是应用服务器端需要做并发控制,实现相对来说比较复杂. FastDFS本身支持文件的排重处理机制,但需要FastDHT作为文件hash的索引存储.FastDHT是FastDFS同一个作者的开源key-value数据库.其排重原理为: FastDFS的storage server每次上传均计算文件的hash值,然

linux 如何删除文件夹下面的文件和文件夹,只保留两个文件

# 删除目录下那两个文件之外的所有文件 find dir/ -type f ! -name file1 -a ! -name file2 | xargs rm -f # 删除所有空目录(非空目录不会被删除,但是会出错误信息,可以忽略) find dir/ -type d | xargs rmdir -p 使用bash shell删除目录中的特定文件的3种方法_linux shell_脚本之家http://www.jb51.net/article/51575.htm

CSDN日报20170224——《程序员该用哪种姿势来理财》

[程序人生] 程序员该用哪种姿势来理财 作者:纯洁的虫子 其实一直想写一篇文章名字都想好了,叫做"程序员该不该理财?".后来想了想,该不该这个就不用想了,必须要理财! 那么市面上那么多理财的方式对于我们屌丝的程序员该如何选择呢? 其实我也是那种土的掉渣的那种类型,以前几乎没有想过神马理财的,一来呢毕业的时候工资全都不够花的还理个毛线,二来总是感觉理财好像都是有钱人搞的东西:后来偶然进入了互联网金融行业,呆了几年,慢慢也接触了很多理财方式,但也还是一个门外汉,此文就是和大家一起聊聊我们程

diff 比较两个文件的差异

功能:比较两个文件的差异,并把不同地方的信息显示出来.默认diff格式的信息. diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件.也使用patch命令对相应的文件打补丁.differential [?d?f??ren??l] 语法:diff    [options]   FILESFILES的格式: FILE1 FILE2 :源是一个文件,目标也是文件.这两个文件必须是文本文件.以逐行的方式,比较文本文件的异同处.DIR1 DIR2   :源是一个

Cocos2d-x移植到Android平台编译的两个文件Android.mk和Application.mk

背景 首先,说说文章的背景.最近手中的一个项目,由于需求中要求提供Web界面的打印功能,当然如果没有打印机,还可以提供保存到本地.项目组长把这个"小任务"分给了我.本着努力为组长分忧解难的思想,领了任务之后,就马上开始了工作. 问题 刚开始的时候,组长给了一个工具(jatoolsprinter)让我研究,我用了一个多小时的时间,做出了一个简单的Demo,然后就是各种的测试,由于 web 打印需要浏览器安装 ActiveX 组件,在随后的测试中,我用了几款浏览器,甚至把安全级别都调到了最

.net学习笔记--文件读写的几种方式

在.net中有很多有用的类库来读写硬盘上的文件 一般比较常用的有: File:1.什么时候使用:当读写件大小不大,同时可以一次性进行读写操作的时候使用         2.不同的方式可以读写文件类型不一样. ReadAllBytes()  WriteAllByte():可以读写任意类型的文件 (里面封装的是FileStream)           ReadAllLines()  ReadAllText():(里面封装是StreamWriter,StreamReader),只能读写文本类型文件

同时读取两个文件进行while循环

知识点:文件对象提供了三个"读"方法: .read()..readline() 和 .readlines().每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量. 问题描述: 我们的设想是想是:当文件读取第一行的时候,读取文件二的所有行数进行打印:读取第二行的时候,读取文件二的所有行数进行打印,以此类推,得到的结果应该是文件一有X行,文件二有Y行,打印总行数为X+(X*Y) 文件1            文件2 a                 x b      

linux 两个文件合并

可以使用cat命令,有两种实现的方式,一种将两个文件合并的到一个新的文件,另一种将一个文件追加到另一个文件的末尾. 方法一:使用cat命令从文件中读入两个文件,然后将重定向到一个新的文件.这种方法可以一次性合并任意多个文件.用法示例:将file1.txt和file2.txt合并到file.txt$ cat file1.txt file2.txt > file.txt 方法二:只使用cat命令读入一个文件,然后使用>>将文本流追加到另一个文件的末位.用法示例:将file1.txt追加到fi