我有一个看起来像这样的pattern.txt文件:
2gqt+FAD+A+601 2i0z+FAD+A+501
1n1e+NDE+A+400 2qzl+IXS+A+449
1llf+F23+A+800 1y0g+8PP+A+320
1ewf+PC1+A+577 2a94+AP0+A+336
2ydx+TXP+E+1339 3g8i+RO7+A+1
1gvh+HEM+A+1398 1v9y+HEM+A+1140
2i0z+FAD+A+501 3m2r+F43+A+1
1h6d+NDP+A+500 3rt4+LP5+C+501
1w07+FAD+A+1660 2pgn+FAD+A+612
2qd1+PP9+A+701 3gsi+FAD+A+902
还有另一个名为data(大约8gb)的文件,其中包含这样的行。
2gqt+FAD+A+601 2i0z+FAD+A+501 0.874585 0.785412
1n1e+NDE+A+400 2qzl+IXS+A+449 0.145278 0.589452
1llf+F23+A+800 1y0g+8PP+A+320 0.784512 0.341786
1ewf+PC1+A+577 2a94+AP0+A+336 0.362542 0.784785
2ydx+TXP+E+1339 3g8i+RO7+A+1 0.251452 0.365298
1gvh+HEM+A+1398 1v9y+HEM+A+1140 0.784521 0.625893
2i0z+FAD+A+501 3m2r+F43+A+1 0.369856 0.354842
1h6d+NDP+A+500 3rt4+LP5+C+501 0.925478 0.365895
1w07+FAD+A+1660 2pgn+FAD+A+612 0.584785 0.325863
2qd1+PP9+A+701 3gsi+FAD+A+902 0.874526 0.125453
然而,数据文件并不像上面给出的那样简单。文件的大尺寸是由于其中有大约18000行,它们在每行的第一列中开始字符串。即以2gqt + FAD + A + 601开始的18000行,接着是以1n1e + NDE + A + 400开始的18000行。但是只有一条这样的行匹配给定的模式,如pattern.txt
我正在尝试将pattern.txt中的行与数据进行匹配,并希望打印出来:
2gqt+FAD+A+601 2i0z+FAD+A+501 0.785412
1n1e+NDE+A+400 2qzl+IXS+A+449 0.589452
1llf+F23+A+800 1y0g+8PP+A+320 0.341786
1ewf+PC1+A+577 2a94+AP0+A+336 0.784785
2ydx+TXP+E+1339 3g8i+RO7+A+1 0.365298
1gvh+HEM+A+1398 1v9y+HEM+A+114 0 0.625893
2i0z+FAD+A+501 3m2r+F43+A+1 0.354842
1h6d+NDP+A+500 3rt4+LP5+C+501 0.365895
1w07+FAD+A+1660 2pgn+FAD+A+612 0.325863
2qd1+PP9+A+701 3gsi+FAD+A+902 0.125453
截至目前,我正在使用perl中的某些内容,例如:
use warnings;
open AS, "combi_output_2_fixed.txt";
open AQ, "NAMES.txt";
@arr=<AS>;
@arr1=<AQ>;
foreach $line(@arr)
{
@split=split(' ',$line);
foreach $line1(@arr1)
{
@split1=split(' ',$line1);
if($split[0] eq $split1[0] && $split[1] eq $split1[1])
{ print $split1[0],"\t",$split1[1],"\t",$split1[3],"\n";}
}
}
close AQ;
close AS;
执行此操作会占用整个内存:并显示内存不足错误消息.. 我知道这可以使用grep完成。但不知道怎么做。 任何人都可以告诉我如何使用grep -F和不使用整个内存来做到这一点?
感谢。
答案 0 :(得分:2)
pattern.txt
是否适合记忆?
如果是,您可以使用grep -F -f pattern.txt data.txt
之类的命令来匹配模式中的data.txt中的行。你会得到完整的一行,只需要额外的处理来获得第二列数字。
或者您可以修复Perl脚本。内存不足的原因是因为您可以将内存中的8gb文件完全读取到内存中,这样您就可以像grep一样逐行处理它。对于8GB文件,您应该使用如下代码:
open FH, "<", "data.txt";
while ($line = <FH>) {
# check $line against list of patterns ...
}
答案 1 :(得分:0)
试试这个
grep "`more pattern.txt`" data.txt | awk -F' ' '{ print $1 " " $2 " " $4}'