试图找出处理具有多个记录的文件的最佳方法,其中一些具有重复项和日期

Trying to figure out best way to manipulate file with multiple records, some with duplicates and dates

我有一个包含多行数据的文件,有些是重复的,记录末尾有日期字段。我希望能够扫描文件并保留最新的重复记录,但某些记录可能包含具有多个唯一行和相同日期的用户,我想保持这些完整。这是数据的示例:

00xbdf0c9fd6;joe@easy.us.com;20141231 <- remove this one
00vbdf0c9fd6;joe@easy.us.com;20150403 <- keep this one (newer date)
00zbef2c9fdx;joe@easy.us.com;20141231 <-keep
00dbkf0ca292;jerry@easy.us.com;20141231 <-keep
0dbds0ca2f6;john@easy.us.com;20141231 <- remove
0dbds0ca2f6;john@easy.us.com;20150403 <- keep (newer date)
00dndf0ca080;betty@easy.us.com;20141231 <-keep
00dbkf0ca292;betty@easy.us.com;20141231 <-keep
00dxdf2ca08x;betty@easy.us.com;20141231 <-keep
00dtkf1ca294;betty@easy.us.com;20141231 <-keep

谢谢

应该可以的

 awk -F";" '{a[";"]=a[";"]>?a[";"]:}END{for(i in a)print i FS a[i]}' file

如果确定行是有序的,意味着较新的行将在较旧的行之后,您可以使用以下 awk 脚本:

awk -F\; '{a[,]=[=10=]}END{for(i in a){print a[i]}}' file

您的第一行或第二行似乎有错字:第一列对他们来说应该是相同的。

这是一个 Perl 解决方案:

#! /usr/bin/perl
use warnings;
use strict;

my %seen;
while (<>) {
    my ($id, $user, $date) = split /;/;
    $seen{$id}{$user} = [$date, $.] if $date gt ($seen{$id}{$user}[0] // q());
}

my @l = sort { $a->[3] <=> $b->[3] } # Sort by line number.
        map { my $id = $_; map [ $id, $_, @{ $seen{$id}{$_} } ],
                               keys %{ $seen{$_} }
            }
        keys %seen;
print join ';', @{$_}[0, 1, 2] for @l;