
두 파일을 비교하는 데 문제가 있습니다. 최선을 다해 설명하겠습니다. 파일이 두 개 있어요f1그리고f2두 그룹을 기준으로 비교해야 해요매개변수(p)그리고가치(v).
원래f1각 매개변수에 대한 값 및 타임스탬프 목록이 포함되어 있습니다.
f1.csv
P,V,TS
p1,12,10:10:00
p2,34,10:21:00
p1,12,10:21:00
p2,34,10:22:00
p1,60,10:35:00
p3,60,10:36:00
p4,22,10:38:00
p4,42,10:40:00
p1,60,10:41:00
p3,58,10:42:00
p2,55,10:45:00
p3,58,10:55:00
문서f2각 매개변수에 대한 이전/최신 값과 타임스탬프가 포함되어 있습니다. 각 매개변수는 이 파일에 한 번만 나타납니다. 명확성을 위해 RTS(실시간 타임스탬프) 및 UTS(업데이트 타임스탬프)입니다.
f2.csv
P,V,RTS,UTS
p1,12,10:00:00,10:05:00
p2,34,10:07:00,10:15:00
p3,60,10:25:00,10:30:00
p4,22,10:30:00,10:32:00
이제 출력을 두 부분으로 나누어 설명하겠습니다. 첫 번째 부분은 간단합니다. f1과 f2의 유사한 (P,V)에 대해 UTS를 최신 TS로 변경합니다. 이것은 의사코드입니다:
for each (P, V) in f1
{
#if value exists in f2
if ((P, V) exists in f2)
{
f2.RTS(P,V)=f2.RTS(P,V)
f2.UTS(P, V) = f1.TS(P, V)
}
}
[]에 있는 o/p 파일 f3의 f2 및 f1의 첫 번째 부분에 있는 값의 경우:-
f3.csv
[ P,V,RTS,UTS
p1,12,10:00:00,10:10:00
p2,34,10:07:00,10:21:00
p1,12,10:00:00,10:21:00
p2,34,10:07:00,10:22:00
p3,60,10:25:00,10:36:00
p4,22,10:30:00,10:38:00]
두 번째 부분은 어렵습니다. f1 파일: f2에 존재하지 않는 값만 처리합니다.
한 번만 나타나고 f2에는 없는 f1 (p4,42,10:40:00)(p2,55,10:45:00)의 값의 경우 출력에 표시된 대로 RTS=UTS=TS가 있어야 합니다. 아래에 표시됩니다.
예:- 단일 발생의 경우
p4,42,10:40:00,10:40:00
나타나는 값에 대해서는 (p3,58,10:42:00),(p3,58,10:55:00),(p1,60,10:35:00)(p1,60,10:41 :00) f2가 아닌 두 번, 첫 번째 발생은 RTS=UTS=TS여야 하고, 동일한 (P,V)의 두 번째 발생은 RTS=((P,V) TS의 첫 번째 발생)이어야 하고 두 번째 발생은 다음과 같아야 합니다. UTS=TS(P,V) 발생.
예: f1에서 (p1,60)이 처음으로 발생합니다.
p1,60,10:35:00,10:35:00
f1에서 (p1,60)이 두 번째로 발생함
p1,60,10:35:00,10:41:00
2부 예상 결과:
f3.csv
[ P,V,RTS,UTS
p1,60,10:35:00,10:35:00
p4,42,10:40:00,10:40:00
p1,60,10:35:00,10:41:00
p3,58,10:42:00,10:42:00
p2,55,10:45:00,10:45:00
p3,58,10:42:00,10:55:00]
최종 출력은 두 개의 출력 CSV 파일을 추가하는 것입니다.
도움을 주셔서 감사합니다. 큰 도움이 될 것입니다.
답변1
나는 Perl이 더 유연한 데이터 구조(배열의 해시)를 가지고 있기 때문에 여기에서 Perl을 사용하고 있습니다.
use strict;
use warnings;
use v5.10;
use autodie;
my (%f1, @order);
open my $fh, "<", "f1.csv";
while (<$fh>) {
next if $. == 1;
chomp;
my ($p, $v, $ts) = split /,/;
push @{ $f1{$p}{$v} }, $ts;
push @order, [$p, $v];
}
close $fh;
my %f2;
open $fh, "<", "f2.csv";
while (<$fh>) {
print if $. == 1;
chomp;
my ($p, $v, $rts, $uts) = split /,/;
$f2{$p}{$v} = [$rts, $uts];
}
close $fh;
for my $key (@order) {
my ($p, $v) = @$key;
if (exists $f2{$p}{$v}) {
my $uts = shift @{$f1{$p}{$v}}
say join(",", $p, $v, $f2{$p}{$v}[0], $uts);
}
}
my @remaining;
for my $p (keys %f1) {
for my $v (keys %{$f1{$p}}) {
my ($rts, $uts) = @{$f1{$p}{$v}};
push @remaining, [$p, $v, $rts, $rts] if $rts;
push @remaining, [$p, $v, $rts, $uts] if $rts and $uts;
}
}
say for map {join ",", @{$_->[1]}}
sort {$a->[0] cmp $b->[0]}
map {[$_->[3], $_]}
@remaining;
실행하면 다음이 생성됩니다.
P,V,RTS,UTS
p1,12,10:00:00,10:10:00
p2,34,10:07:00,10:21:00
p1,12,10:00:00,10:21:00
p2,34,10:07:00,10:22:00
p3,60,10:25:00,10:36:00
p4,22,10:30:00,10:38:00
p1,60,10:35:00,10:35:00
p4,42,10:40:00,10:40:00
p1,60,10:35:00,10:41:00
p3,58,10:42:00,10:42:00
p2,55,10:45:00,10:45:00
p3,58,10:42:00,10:55:00
답변2
내 친구의 도움을 받아 코드를 작성했습니다. 참고용으로만 사용하세요. 건배
#!/bin/awk -f
BEGIN{
FS=",";
OFS=",";
}
{
if(NR==FNR)
{
a[var]=$1" "$2
ts[var]=$3
var++
}else if(NR>FNR)
{
b[sec]=$1" "$2
rt[sec]=$3
ut[sec]=$4
sec++
}
}
END{
#Code for first part of the o/p
for(i=0;i<var;i++)
{
for(j=0;j<sec;j++)
{
if(!(a[i]<b[j]||a[i]>b[j]))
{ m[a[i]]=1
print a[i]" "rt[j]" "ts[i]
}
}
}
#Code for second part of the o/p
for(i=0;i<var;i++)
{
if(m[a[i]]!=1)
{
h[a[i]]++
if(h[a[i]]==1)
{
rts[a[i]]=ts[i]
print rts[a[i]]
print a[i]" "ts[i]" "ts[i]
}
else{
print a[i]" "rts[a[i]]" "ts[i]
}
}
}
}