试图找出处理具有多个记录的文件的最佳方法,其中一些具有重复项和日期
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;
我有一个包含多行数据的文件,有些是重复的,记录末尾有日期字段。我希望能够扫描文件并保留最新的重复记录,但某些记录可能包含具有多个唯一行和相同日期的用户,我想保持这些完整。这是数据的示例:
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;