如何使用C或Perl将文件的所有元素与另一个文件的所有元素进行比较以获得更大的数据?文件1包含100,000个这样的数字,文件2包含500,000个元素.
我在foreach中使用了foreach,将每个元素拆分为数组.它在perl中运行得很好,但是从file1中的File2检查和打印每一列元素的时间是40分钟.有28个这样的专栏.
有没有办法减少时间或使用像C这样的其他语言?
0.1
0.11
0.12
0.13
0.14
0.15
0.16
0.17
0.18
0.19
0.2
Run Code Online (Sandbox Code Playgroud)
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.2 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28
Run Code Online (Sandbox Code Playgroud)
如果文件2中的元素匹配打印'列号',如果不打印'0'.
1 2 0 0 0 0 0 0 0 10 11 12 13 14 15 16 17 18 19 20 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的代码.注意:它在文件1中按列方式检查File2,如果为true则打印列号,如果为false则打印"0" .它将打印28个不同文件中每列的输出.
#!/usr/bin/perl-w
chomp($file = "File1.txt");
open(FH, $file);
@k_org = <FH>;
chomp($hspfile = 'file2.txt');
open(FH1, $hspfile);
@hsporg = <FH1>;
for $z (1 .. 28) {
open(OUT, ">$z.txt");
foreach (@hsporg) {
$i = 0;
@h_org = split('\t', $_);
chomp ($h_org[0]);
foreach(@k_org) {
@orginfo = split('\t', $_);
chomp($orginfo[0]);
if($h_org[0] eq $orginfo[0]) {
print OUT "$z\n";
$i = 1;
goto LABEL;
} elsif ($h_org[0] ne $orginfo[0]) {
if($h_org[0]=~/(\w+\s\w+)\s/) {
if($orginfo[0] eq $1) {
print OUT "0";
$i = 1;
goto LABEL;
}
}
}
}
if ($i == 0) {
print OUT "0";
}
LABEL:
}
}
close FH;
close FH1;
close OUT;
Run Code Online (Sandbox Code Playgroud)
如果您sort(1)是文件,则可以一次性检查.不应该花费超过几秒钟(包括排序).
另一种方法是将file1中的所有值加载到散列中.这是多一点的内存消耗,特别是如果file1大,但要快(再次,不超过几秒钟).
我会选择perl而不是C来完成这样的工作,而且我比C更精通C语言.在perl中为这种工作编写代码要快得多,不易出错并且运行速度足够快.