我想从文件中获取重复行的最后一个条目 重复检查的基础将是csv的第一个元素。
副本可能相邻也可能不相邻。
输入文件:
971~11
972~12
973~11
974~11
972~11
预期产出:
971~11
973~11
974~11
972~11
我不是在寻找一个perl单行,因为我打算将其写为
一个子程序。
谢谢!
PS:
我已从某处修改过此代码,但这只是删除了重复项
#!/usr/bin/perl -w
while (<STDIN>) { push (@lines, $_); }
print "-\n";
foreach my $i (@lines)
{
@newline = split(/\||~/, $i);
if (scalar(grep{ /$newline[0]/ } @lines) == 1)
{
print $i;
}
}
答案 0 :(得分:4)
如果输出顺序无关紧要,最简单的方法是使用哈希来执行重复删除。如下所示:
#!/usr/bin/perl -w
use strict;
sub printlast(@) {
my %dedup;
foreach my $line (@_) {
my $a = (split(/\||~/, $line))[0];
$dedup{$a} = $line;
}
print $dedup{$_} for keys %dedup; # or sort keys %dedup for prettier output
}
my @lines;
while (<STDIN>) { push (@lines, $_); }
print "-\n";
printlast(@lines);
答案 1 :(得分:1)
在寻找重复数据删除时,使用哈希几乎总是最好的。
这是类似于接受的答案(因为@Mat打败了我)
#!/usr/bin/env perl -lw
use Data::Dumper; $Data::Dumper::Indent = 1;
my %seen;
while (<DATA>) {
chomp;
my @fields = split('~');
$seen{$fields[0]} = $fields[1];
}
my @output;
while (my ($k,$v) = each %seen) {
push @output, join('~', $k, $v);
}
print Dumper \@output;
__DATA__
971~11
972~12
973~11
974~11
972~11