小さいファイルと大きいファイルの 2 つのファイルがあります。小さなファイルは、大きなファイルのサブセットです。
例えば:
小さなファイル:
solar:1000
alexey:2000
大きなファイル:
andrey:1001
solar:1000
alexander:1003
alexey:2000
Small.txt にも存在する Big.txt からすべての行を削除したいと考えています。つまり、小さいファイルに共通する大きなファイルの行を削除したいのです。
そこで、以下に示すように Perl スクリプトを作成しました。
#! /usr/bin/perl
use strict;
use warnings;
my ($small, $big, $output) = @ARGV;
open(BIG, "<$big") || die("Couldn't read from the file: $big\n");
my @contents = <BIG>;
close (BIG);
open(SMALL, "<$small") || die ("Couldn't read from the file: $small\n");
while(<SMALL>)
{
chomp $_;
@contents = grep !/^\Q$_/, @contents;
}
close(SMALL);
open(OUTPUT, ">>$output") || die ("Couldn't open the file: $output\n");
print OUTPUT @contents;
close(OUTPUT);
ただし、この Perl スクリプトは Big.txt 内の Small.txt と共通の行を削除しません。
このスクリプトでは、最初に大きなファイル ストリームを開き、コンテンツ全体を配列 @contents にコピーします。次に、小さなファイルの各エントリを繰り返し処理し、大きなファイルにそのエントリが存在するかどうかを確認します。Big File から行をフィルター処理し、配列に保存し直します。
このスクリプトが機能しない理由がわかりません。ありがとう