私はPerlが初めてです。それぞれ 5,000 行を超える 8 つのテキスト ファイルがあります。最初の 5 つのファイルで見つかったが、最後の 3 つのファイルで見つからなかったエントリ (レコード) を検索するための perl スクリプトを作成したいと考えています。ファイルが (A、B、C、D、E、F、G、H) であるとしましょう。したがって、A
toE
ではなくF
toにあるエントリを取得したいと考えていますH
。
この仕事のコードの書き方についてアドバイスをいただけますか?
私はPerlが初めてです。それぞれ 5,000 行を超える 8 つのテキスト ファイルがあります。最初の 5 つのファイルで見つかったが、最後の 3 つのファイルで見つからなかったエントリ (レコード) を検索するための perl スクリプトを作成したいと考えています。ファイルが (A、B、C、D、E、F、G、H) であるとしましょう。したがって、A
toE
ではなくF
toにあるエントリを取得したいと考えていますH
。
この仕事のコードの書き方についてアドバイスをいただけますか?
私があなたを正しく理解しているなら、あなたは以下をする必要があります:
2つのリストを使用する代わりに、2つのハッシュを使用します。
# Two sets of files to be compared.
my @Set1 = qw(A B C D E);
my @Set2 = qw(F G H);
# Get all the items out of each set into hash references
my $items_in_set1 = get_items(@Set1);
my $items_in_set2 = get_items(@Set2);
my %unique_to_set1;
for my $item (keys %$items_in_set1) {
# If an item in set 1 isn't in set 2, remember it.
$unique_to_set1{$item}++ if !$items_in_set2->{$item};
}
# Print them out
print join "\n", keys %unique_to_set1;
sub get_items {
my @files = @_;
my %items;
for my $file (@files) {
open my $fh, "<", $file or die "Can't open $file: $!";
while( my $item = <$fh>) {
chomp $item;
$items{$item}++;
}
}
return \%items;
}
1回限りの場合は、シェルで実行できます。
cat A B C D E | sort | uniq > set1
cat F G H | sort | uniq > set2
comm -23 set1 set2
cat A B C D E
ファイルを1つのストリームにまとめて塗りつぶします。それはに渡されsort
、次にuniq
重複を削除します(uniq
行がソートされていない限りうまく機能しません)。結果はファイルに入れられますset1
。これは、2番目のセットに対して再度実行されます。 comm
次に、2つのセットファイルでそれらを比較するために使用され、に固有の行のみが表示されますset1
。