【发布时间】:2020-12-12 05:02:31
【问题描述】:
我有一个这样的文件有 100 万行
aaa,111
bbb,222
...
...
a3z,222 (line# 500,000)
...
...
bz1,444 (last line# 1 million)
我需要检查的是逗号后的第二个值是否唯一。如果没有,则打印出行号。在上面的例子中它应该打印出来
Duplicate: line: 500000 value: a3z,222
为此,我使用 perl 并将第二列的值存储在数组中。如果我在数组中找不到值,我将其添加到其中。如果该值已经存在,那么我将其作为副本打印出来。
问题是我使用的逻辑非常慢。完成需要2-3个小时。有没有办法可以加快速度?如果不需要,我不想创建数组。我只想检查文件第 2 列中的重复值。
如果有更快的方法在批处理文件中执行此操作,我愿意接受。
这是我的工作代码。
# header
use warnings;
use DateTime;
use strict;
use POSIX qw(strftime);
use File::Find;
use File::Slurp;
use File::Spec;
use List::MoreUtils qw(uniq);
print "Perl Starting ... \n\n";
# Open the file for read access:
open my $filehandle, '<', 'my_huge_input_file.txt';
my $counter = 0;
my @uniqueArray;
# Loop through each line:
while (defined(my $recordLine = <$filehandle>))
{
# Keep track of line numbers
$counter++;
# Strip the linebreak character at the end.
chomp $recordLine;
my @fields = split(/,/, $recordLine);
my $val1=$fields[0];
my $val2=$fields[1];
if ( !($val2 ~~ @uniqueArray) && ($val2 ne "") )
{
push(@uniqueArray, $val2);
}
else
{
print ("DUP line: $counter - val1: $val1 - val2: $val2 \n");
}
}
print "\nPerl End ... \n\n";
【问题讨论】:
-
If not then print out the line number.的第二行和具有该值的任何后续行?还是第一个?还是第一个?