2つのテキストファイルを比較し、そのIDに関連付けられている一致するID、sub_ids、およびタイムスタンプを印刷します。

2つのテキストファイルを比較し、そのIDに関連付けられている一致するID、sub_ids、およびタイムスタンプを印刷します。

私はPerlでこの解決策が興味深いと思いました。 2番目のファイルに一致する列と2つの追加列(リビジョンID nリリース日)を印刷しようとする同様の状況があります。このコードでこれら2つのファイルをどのように読み取ることができますか?私はこのコードを分析し、ハッシュと配列について学ぶつもりです。

#!/usr/bin/perl

# create names lookup table from first file
  my %names;
  while (<>) {
  (my $col1)= split / /, $_;
  $names{$col1} = 1;
  last if eof;
  }

# scan second file
  while (<>) {
  print if /^(\S+).*/ && not $names{$1};
  }

 File 1:
 Name               IRR ID
 slic73p1hsicbxttop 99034438
 c73p1avrsrldo150top99034238
 c73p1avrfusevrmtop 99034201

 Example file 2
 Type Name              Rev ID   IRR ID   PP Group      Date Released  PP Category                              
 Comp c73p1avrfusevrmtop PROD_2_5 99034201 SEG RIP Reuse 5/3/2015 6:59   Hard   
 Comp c73p1avrfusevrmtop PROD_2_4 99034201 SEG RIP Reuse 4/23/2015 10:27 Hard   
 Comp c73p1avrfusevrmtop PROD_2_3 99034201 SEG RIP Reuse 3/17/2015 23:51 Hard   
 Comp c73p1avrfusevrmtop PROD_2_2 99034201 SEG RIP Reuse 2/1/2015 11:27  Hard   

 Expected Output: there are also other rows in the table which doesn't match
 IRR ID   Rev ID   Date Released (date to be printed in a chronological   order)
 99034201 PROD_2_5 5/3/2015 6:59    
 99034201 PROD_2_4 4/23/2015 10:27  
 99034201 PROD_2_3 3/17/2015 23:51  
 99034201 PROD_2_2 2/1/2015 11:27  

ベストアンサー1

最初のブロック:

my %names;
while (<>) {
    ( my $col1 ) = split / /, $_;
    $names{$col1} = 1;
    last if eof;
}
  • 私たちはハッシュを宣言しますnames
  • 一度に1行ずつファイルハンドルを繰り返します。このファイルハンドルは<>Perlにとって特別な意味を持ちます。誰でも STDINまたはコマンドラインで指定されたファイルの内容。このコードは後者の場合にのみ機能するように見えますが、これは通常間違った形式です。
  • 各ループ反復で$_現在の行に設定されます。
  • $_空白を配列splitに変換します。
  • my ( $col1 )は配列です。分割の最初の要素がに割り当てられます$col1。 (残りは割り当てを使用できますmy ( $col1, $col2, @more_cols ) = ...
  • $col1ハッシュのキーはnames1に設定されます。

たとえば、

$VAR1 = {
          'c73p1avrsrldo150top' => 1,
          'c73p1avrfusevrmtop' => 1,
          'slic73p1hsicbxttop' => 1
        };

次に、2番目のファイルから始めます。

  while (<>) {
      print if /^(\S+).*/ && not $names{$1};
  }

行の最初の単語($ 1に移動)を「ただ」キャプチャする無効な正規表現で始まります。そして、$names{$1} いいえ一度設定するとラインが印刷されます。

Comp入力データが与えられると、これは単に動作しません。存在するか確認してnamesいないからです。

おすすめ記事