将另一个文件中存储的320K模式的1M行文件打包

时间:2015-12-29 15:14:56

标签: bash grep cygwin gnu-parallel

我试图grep一行1M'|'从另一个文件中分离出320K模式的文件,并使用管道连接到Ole Tange的并行包,并将匹配的结果传送到另一个文件中。我在Windows 7上使用带有24核和16GB物理内存的Cygwin。

通过此链接后我使用的命令 Grepping a huge file (80GB) any way to speed it up?

< matchReport1.dat parallel --pipe --block 2M LC_ALL=C grep --file=nov15.DAT > test.match

其中matchReport1.dat是1M行'|'分隔文件和320K模式存储在nov15.DAT中。任务管理器活动命中所有24个核心,物理内存使用量跃升到~15GB,我开始收到grep内存耗尽的消息。

然后我尝试将nov15.DAT模式文件拆分为10个较小的块并运行那些

的grep

parallel --bar -j0 -a xaa "LC_ALL=C grep {} matchReport1.dat" > testxaa

但是这只需要太长时间(30K行中只有1.6K的花费大约需要15分钟)。

我的nov15.DAT模式文件由'A12345M'之类的字符串和此模式需要匹配的文件组成,即matchReport1.dat包含'A12345M_dfdf'和'A12345M_02'等字符串,因此不能在grep中使用-F选项。除了使用数据库之外,有人可以建议修复或任何其他选项吗?

下载样本

nov15.DAT - &gt; http://pastebin.com/raw/cUeGcYLb

matchReport1.dat - &gt; http://pastebin.com/raw/01KSGN6k

2 个答案:

答案 0 :(得分:1)

我假设您只想将nov15.DAT的字符串与matchReport1.dat的第二列的开头进行比较。

试试这个:修改nov15.DAT以避免从第一个字符到最后一个字符的每一行进行比较:

sed 's/.*/^"[^|]*"|"&/' nov15.DAT > mov15_mod1.DAT

然后使用mov15_mod1.DAT并行命令。

答案 1 :(得分:0)

不是很准确,但是如果nov15中的ID是唯一的并且与行中的其他位置不匹配,那么这可能正常。它很快:

perl -F'\|' -ane 'BEGIN{chomp(@nov15=`cat nov15.DAT`);@m{@nov15}=1..$#nov15+1;} for $l (split/"|_/,$F[1]) { if($m{$l}) { print }}' matchReport1.dat