我发现 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
并且它不会。