私は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
ハッシュのキーはnames
1に設定されます。
たとえば、
$VAR1 = {
'c73p1avrsrldo150top' => 1,
'c73p1avrfusevrmtop' => 1,
'slic73p1hsicbxttop' => 1
};
次に、2番目のファイルから始めます。
while (<>) {
print if /^(\S+).*/ && not $names{$1};
}
行の最初の単語($ 1に移動)を「ただ」キャプチャする無効な正規表現で始まります。そして、$names{$1}
いいえ一度設定するとラインが印刷されます。
Comp
入力データが与えられると、これは単に動作しません。存在するか確認してnames
いないからです。