Bash 使用存储在另一个文件中的320K模式对1M行文件进行灰显

Bash 使用存储在另一个文件中的320K模式对1M行文件进行灰显,bash,grep,cygwin,gnu-parallel,Bash,Grep,Cygwin,Gnu Parallel,我试图从另一个文件中grep出一个1M行的带有320K模式的“|”分隔文件,该文件通过管道连接到Ole Tange的并行包,并将匹配结果通过管道连接到另一个文件中。我在Windows7上使用Cygwin,它有24个内核和16GB的物理内存 我通过此链接后使用的命令 test.match 其中matchReport1.dat是1M行“|”分隔文件,320K模式存储在nov15.dat中。任务管理器活动会命中所有24个内核,物理内存使用量会跃升到~15GB,我开始收到消息说grep内存已耗尽 然

我试图从另一个文件中grep出一个1M行的带有320K模式的“|”分隔文件,该文件通过管道连接到Ole Tange的并行包,并将匹配结果通过管道连接到另一个文件中。我在Windows7上使用Cygwin,它有24个内核和16GB的物理内存

我通过此链接后使用的命令

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行的grepping耗时15分钟)

我的nov15.DAT模式文件包含诸如“A12345M”之类的字符串以及该模式需要匹配的文件,即matchReport1.DAT包含诸如“A12345M_dfdff”和“A12345M_02”之类的字符串,因此无法在grep中使用-F选项。除了使用数据库,有人能建议一个修复方案或任何其他选项吗

这是样品

nov15.DAT->


matchReport1.dat->

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

尝试以下操作:修改nov15.DAT以避免在每行中从第一个字符到最后一个字符进行比较:

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

然后在并行命令中使用
mov15_mod1.DAT

不是很准确,但是如果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 

在您的问题中添加matchReport1.dat的一些行和nov15.dat的一些行。这可能会有所帮助:我理解您建议的mod。我将尽快返回性能统计数据,基于您在上面发布的gnu并行链接。
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