2つのファイルの値のセットを比較し、awkを使用して3番目のファイルの出力を印刷します。

2つのファイルの値のセットを比較し、awkを使用して3番目のファイルの出力を印刷します。

2つのファイルの比較に問題があります。頑張って説明します。ファイルが2つあります。f1そしてf22つのグループに基づいて比較する必要があります。パラメータ(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

それでは、出力を2つの部分に分けて説明します。最初の部分は簡単です。 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]

2番目の部分は難しいです。 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ではなく2回、最初の発生はRTS = UTS = TSでなければならず、同じ(P、V)の2番目の発生はRTS =((P、V)TSの最初の発生)でなければなりません。と同じでなければなりません。 UTS=TS(P,V) 発生。

例: f1 で (p1,60) が初めて発生します。

 p1,60,10:35:00,10:35:00

f1で(p1,60)が2番目に発生する

 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]

最後の出力は、2つの出力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

おすすめ記事