linux – grep与一个文件中的模式(3.2Gb)匹配在另一个文件中(4.8Gb)

我有两个文本文件.一个是带有名称,电子邮件地址和其他字段的文本文件.来自file1的一些行:

John:myemail@gmail.com:johnson123:22hey
Erik:thatwhatsup@gmail.com:johnson133:22hey
Robert:whatsup@gmail.com:johnson123:21hey
Johnnny:bro@gmail.com:johnson123:22hey

另一个只包含电子邮件地址. file2中的示例:

1@gmail.com
rsdoge@gmail.com
mynameiscurt@hotmail.com
myemail@gmail.com

我希望输出是file1的每个完整行,在file2中有一个电子邮件地址.例如,myemail@gmail.com在file2中,所以我想从file1看到以下行:

John:myemail@gmail.com:johnson123:22hey

有没有一种简单的方法来搜索file1并输出与“电子邮件地址列表”file2匹配的行?

我一直在寻找HOURS,但我的Google搜索(和StackOverflow搜索)以及命令行上的努力到目前为止还没有效果.

我尝试过的命令会起作用:

fgrep -f file2.txt file1.txt > matched.txt
grep -F -f ....
grep -F -x -f file1 file2 > common 

等等,但他们都得到了grep内存耗尽 – 我匹配的文件是4.8GB(file1)和3.2GB(file2,只包含电子邮件地址).我假设这些命令使内存耗尽.我找到了一个方法,使用find来执行命令更平滑我猜,但没有让它工作.

tldr;需要将file2与file1匹配,如果file2中有一行与file1中的行匹配,则输出它.文件很大,我需要一种不用尽所有内存的安全方法.

谢谢你,整天搜索并试验,不想放弃(5小时).

最佳答案
操作大文件相当困难但你可以分三步完成:

>按第二个字段排序file1

sort -k2,2 -t: file1 >file1.sorted

>排序file2

sort file2 >file2.sorted

>通过电子邮件字段加入2个文件

join -t: -2 2 file2.sorted file1.sorted -o 2.1,0,2.3,2.4 >matched.txt

转载注明原文:linux – grep与一个文件中的模式(3.2Gb)匹配在另一个文件中(4.8Gb) - 代码日志