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] といった
正規表現では表現しにくいです。別のデータ構造を考えた
方がいいかもしれない。
[上に]
[前に]
[次に]