0

2 つの異なるファイルを読み取り、これら 2 つのファイルの ID を比較し、ID が一致するデータのみを出力する perl スクリプトを作成しました。ID ファイルは配列に読み込まれ、データ ファイルは 1 行ずつ読み込まれます。これはすべてかなりうまく機能しますが、さらに追加する必要があります。私のデータ ファイルには、ID が重複している行が含まれていることがあります。これは、被験者がサンプルを提供するために複数回訪問したためです。したがって、これらの重複を探して、最新の訪問日のみを取得する必要があります。

したがって、私のデータファイルは次のようになります。

   ID  DOV  Data1  Data2 etc etc

ハッシュが重複を検索する方法であることがわかりましたが、私が見たすべての修正は、単に重複を無差別に削除することであり、これは私が望んでいるものではありません。

何か案は?

4

2 に答える 2

0

これにより、各 ID の最後の DOV が表示され、入力データについて多くの仮定が行われるため、そのままでは機能しない可能性が高くなります。(特に、入力データが日付でソートされていない場合、各 ID で最後に表示された日付が取得されるだけなので、まったく機能しません。また、" Mon Jul 9 15:51:22 CEST 2012" の場合、最初のスペース (この例では "Mon") までの日付のみが取得されます)。 .

#!/usr/bin/env perl    

use strict;
use warnings;

my %visit;
while (<DATA>) {
  my ($id, $date) = split;
  $visit{$id} = $date;
} 

for my $id (sort keys %visit) {
  print "$id => $visit{$id}\n";
} 

__DATA__
1       2012-01-01
2       2012-01-02
1       2012-02-03
3       2012-02-04
2       2012-03-05
3       2012-03-06
4       2012-04-07
1       2012-04-08
5       2012-05-09
1       2012-05-10
于 2012-07-09T13:52:59.550 に答える
0
# read id file
my %id_hash;
while (<IDFILE>) {
  chomp;
  $id_hash{$_} = 1;
}

#read data file
while (<DATAFILE>) {
  my @arr = split(/\s+/, $_);
  if (defined $id_hash{$arr[0]}) { # only process if exists in id file
    # and only if this is the first data entry or a later visit
    if ( (not ref $id_hash{$arr[0]}) or ($id_hash{$arr[0]}[1] < $arr[1]) ) {
      # store all data in an array ref
      $id_hash{$arr[0]} = [ @arr ];
    }
  }
}

for my $id (keys %id_hash) {
  print join(" ", @{$id_hash{$id}}), "\n";
}
于 2012-07-09T14:02:26.137 に答える