두 파일의 값 세트를 비교하고 awk를 사용하여 세 번째 파일의 출력을 인쇄합니다.

두 파일의 값 세트를 비교하고 awk를 사용하여 세 번째 파일의 출력을 인쇄합니다.

두 파일을 비교하는 데 문제가 있습니다. 최선을 다해 설명하겠습니다. 파일이 두 개 있어요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]
                }
          }
          }
      }

관련 정보