比较两个文本文件并打印出匹配的 ids、sub_ids 和与 id 相关的时间戳

比较两个文本文件并打印出匹配的 ids、sub_ids 和与 id 相关的时间戳

我发现 Perl 中的这个解决方案很有趣。我有类似的情况,要打印第二个文件中的匹配列和两个附加列(修订版 ID n 发布日期)。我如何从这段代码中读取这两个文件。我计划剖析这段代码并从中学习哈希和数组。

#!/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
  • 我们循环遍历文件句柄,一次一行。该文件句柄<>在 perl 中具有特殊含义 - 它是任何一个 STDIN或在命令行上指定的文件的内容。看起来这段代码只适用于后一种情况,这通常是不好的形式。
  • 在每次循环迭代中,$_设置为当前行。
  • $_位于split空白处,这会将其转换为数组。
  • my ( $col1 )是一个数组 - 分割中的第一个元素被分配给$col1。 (您可以使用 分配其余部分my ( $col1, $col2, @more_cols ) = ...
  • $col1哈希中的键names设置为 1。

例如:

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

然后我们从第二个文件开始:

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

从一个错误的正则表达式开始,它“只是”捕获该行的第一个单词(进入 $1)。而如果$names{$1} 不是设置后,将打印该行。

给定你的输入数据是根本行不通的 - 因为你正在检查是否Comp存在names并且它不会。

相关内容