3

私はPerlが初めてです。それぞれ 5,000 行を超える 8 つのテキスト ファイルがあります。最初の 5 つのファイルで見つかったが、最後の 3 つのファイルで見つからなかったエントリ (レコード) を検索するための perl スクリプトを作成したいと考えています。ファイルが (A、B、C、D、E、F、G、H) であるとしましょう。したがって、AtoEではなくFtoにあるエントリを取得したいと考えていますH

この仕事のコードの書き方についてアドバイスをいただけますか?

4

1 に答える 1

5

私があなたを正しく理解しているなら、あなたは以下をする必要があります:

  1. AE内のすべてのアイテムのリストを作成します(リスト1と呼びます)
  2. FHのアイテムの別のリストを作成します(リスト2)
  3. 2にない1のすべてのアイテムを検索します。

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

于 2012-06-20T05:32:27.643 に答える