如何使用perl从文件中获取最后一个重复行

时间:2011-12-31 14:42:37

标签: perl

我想从文件中获取重复行的最后一个条目 重复检查的基础将是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;
    }
}

2 个答案:

答案 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