2つのファイルの比較方法

[上に] [前に] [次に]
1999/08/24(火) 22:55:31
新しいファイルの中にあるデータから、1つ目のファイルの中の
データとマッチしないものだけを抽出するというスクリプト(PERL)を
作ろうとしているのですが、どうもうまくいきません。

以下の方法でうまくいかないのは、なんとなく分かるのですが、
どういうふうに直したらよいか、教えて下さい。


if (!open(DB,"$datafile")) { &error(1); }
@lines = <DB>;
close(DB);

if (!open(DB2,"$newfile")) { &error(2); }
@lines2 = <DB2>;
close(DB2);

foreach $line2 (@lines2) {
($username2,$remote_address2)=split(/\s+/);
foreach $line (@lines) {
($username,$remote_address)=split(/\s+/);
if( $remote_address =~/$remote_address2/i) { ; }
else { push(@data,$lines2); }
}
}

if (!open(DB2,">$newfile")) { &error(3); }
print DB2 @data;
close(DB2);

B-Cus 1999/08/24(火) 23:18:04
if (!open(DB,"$datafile")) { &error(1); }
while (<DB>){
 $buf{$_}=1;
}
close(DB);

if (!open(DB2,"$newfile")) { &error(2); }
while (<DB>){
 if ( ! defined $buf{$_} ){
  違う
 }
}
close(DB2);

とか。

1999/08/25(水) 12:18:04
ありがとうございます。
さっそく下記のようにやってみてましたが、
全部のデータが画面に出力されてしまいました。



if (!open(DB,"$datafile")) { &error(1); }
while (<DB>){
$buf{$_}=1;
}
close(DB);

if (!open(DB2,"$newfile")) { &error(2); }
while (<DB2>){
if ( ! defined $buf{$_} ){
print "$_";
}
}
close(DB2);


$remote_address2は101.101.[1-9][0-9].
$remote_addressは101.101.15.101
という形になっているのですが、
そのためにマッチしなかったのか、
あるいは出力の方法が間違っていたのでしょうか?

B-Cus 1999/08/25(水) 20:14:24
> $remote_address2は101.101.[1-9][0-9].
> $remote_addressは101.101.15.101
$datafile は
 hoge 101.101.1.1
 fuga 101.101.3.4
などと具体的なIPアドレスが書いてあって、$newfile は
 hoge 101.101.[1-9][0-9].
 fuga 101.101.101.
と、正規表現風になっているの? それとも $newfile は
 hoge 101.101.88.
 fuga 101.101.10.
と、101.101.[1-9][0-9]. にマッチする形式で書いてあるの?
# こんな大事なこと、最初に書いてほしい。

1999/08/25(水) 20:43:31
[[解決]]
> こんな大事なこと、最初に書いてほしい。

すみませんでした。
せっかく教えていただいたのに、説明が足りませんでした。
ご迷惑をかけたことを反省します。

$datafileは、
hoge 101.101.[1-9][0-9].
fuga 202.202.[1-9].
というデータのリストで、

$newfileは、
hoge 101.101.88.
fuga 101.101.10.
というデータのリストでした。
$newfileのデータを一つ一つ取り出して、
$datafileにマッチしないものだけを取り出したかったのです。


ただ、ご迷惑をかけそうなので、
しばらく自分で考えてみたいと思います。
ありがとうございました。
すみません。

B-Cus 1999/08/25(水) 22:40:23
> ($username2,$remote_address2)=split(/\s+/);
($username2,$remote_address2)=split(/\s+/,$line2);
> ($username,$remote_address)=split(/\s+/);
($username,$remote_address)=split(/\s+/,$line);
> if( $remote_address =~/$remote_address2/i) { ; }
if( $remote_address2 =~/^$remote_address/i) { ; }

ってなところかね。後は `.' が正規表現で任意の一文字に
マッチしてしまうことに注意、かな。

一般論だけど、そもそもIPアドレスは [1-9][0-9] といった
正規表現では表現しにくいです。別のデータ構造を考えた
方がいいかもしれない。

[上に] [前に] [次に]