0

これはイライラします。1行に電話番号だけのテキストファイルが2つあります。file1 から最初の行を読み取り、一致する file2 を検索する必要があります。一致しない場合は、行の値を出力ファイルに書き込みます。私はこれを試してきましたが、それが間違っていることを知っています。

$file1 = 'pokus1.txt';
$file2 = 'pokus2.txt';

open (F1, $file1) || die ("Could not open $file1!");
open (F2, $file2) || die ("Could not open $file2!");
open (OUTFILE, '>>output\output_x1.txt');
@f1data = <F1>;
@f2data = <F2>;

while (@f1data){
    @grp = grep {/$f1data/} @f2data;

    print OUTFILE "$grp";
}
close (F1);
close (F2);
close (OUTFILE);

誰かが助けてくれることを願っていますか?ありがとうブレント

4

3 に答える 3

2

バッシュ:

存在しません

grep -vf ファイル1 ファイル2 > ファイル3

共有

grep -f ファイル1 ファイル2 > ファイル4

于 2013-05-24T20:44:26.050 に答える
1

1 つのファイルを処理してそのデータをハッシュのキーとして保存し、後でそのキーが存在するかどうかを確認してもう一方のファイルを処理する慣習的なソリューション:

#!/usr/bin/env perl

use warnings;
use strict;

my (%phone);

open my $fh1, '<', shift or die;
open my $fh2, '<', shift or die;
##open my $ofh, '>>', shift or die;

while ( <$fh2> ) { 
    chomp;
    $phone{ $_ } = 1;
}

while ( <$fh1> ) { 
    chomp;
    next if exists $phone{ $_ };
    ##printf $ofh qq|%s\n|, $_;
    printf qq|%s\n|, $_;
}

exit 0;

次のように実行します。

perl script.pl file1 file2 > outfile
于 2013-05-24T19:39:51.077 に答える
1

あるグループ内の別のグループ内の 1 つのデータであるという質問を取得するたびに(そして、それらがかなり出てくる場合は、ハッシュの観点から考える必要があります。

ハッシュはキー付きルックアップです。たとえば、ファイル #1 から取得した電話番号をキーにしたハッシュを作成するとします。ファイル #2 の行を読み取った場合、それがファイル #1 にあるかどうかは、ハッシュを見るだけで簡単にわかります。高速で効率的。

use strict;   #ALWAYS ALWAYS ALWAYS
use warnings; #ALWAYS ALWAYS ALWAYS

use autodie;  #Will end the program if files you try to open don't exist

# Constants are a great way of storing data that is ...uh... constant
use constant {
    FILE_1    =>  "a1.txt",
    FILE_2    =>  "a2.txt",
};

my %phone_hash;

open my $phone_num1_fh, "<", FILE_1;

#Let's build our phone number hash
while ( my $phone_num = <$phone_num1_fh> ) {
    chomp $phone_num;
    $phone_hash{ $phone_num } = 1;   #Doesn't really matter, but best not a zero value
}
close $phone_num1_fh;

#Now that we have our phone hash, let's see if it's in file #2
open my $phone_num2_fh, "<", FILE_2;
while ( my $phone_num = <$phone_num2_fh> ) {
    chomp $phone_num;
    if ( exists $phone_hash { $phone_num } ) {
        print "$phone_num is in file #1 and file #2";
    }
    else {
        print "$phone_num is only in file #2";
    }
}

それがどれほどうまく機能するかを見てください。唯一の問題は、ファイル #2 にはない電話番号がファイル #1 に含まれている可能性があることです。これは、ファイル #2 のすべての電話番号に対して 2 つ目のハッシュを作成するだけで解決できます。

2 つのハッシュを使用して、これをもう一度実行してみましょう。

my %phone_hash1;
my %phone_hash2;

open my $phone_num1_fh, "<", FILE_1;

while ( my $phone_num = <$phone_num1_fh> ) {
    chomp $phone_num;
    $phone_hash1{ $phone_num } = 1;
}
close $phone_num1_fh;

open my $phone_num2_fh, "<", FILE_2;

while ( my $phone_num = <$phone_num2_fh> ) {
    chomp $phone_num;
    $phone_hash2{ $phone_num } = 1;
}
close $phone_num1_fh;

次に、keys を使用してキーを一覧表示し、それらを調べます。%in_common電話が両方のハッシュにあるときにハッシュを作成します

my %in_common;

for my $phone ( keys %phone_hash1 ) {
    if ( $phone_hash2{$phone} ) { 
       $in_common{$phone} = 1;    #Phone numbers in common between the two lists
    }
}

%phone_hash1これで、 、%phone_hash2、および の3 つのハッシュがあり%in_commonます。

for my $phone ( sort keys %phone_hash1 ) {
    if ( not $in_common{$phone} ) {
         print "Phone number $phone is only in the first file\n";
    }
}

for my $phone ( sort keys %phone_hash2 ) {
    if ( not $in_common{$phone} ) {
        print "Phone number $phone is only in " . FILE_2 . "\n";
    }
}

for my $phone ( sort keys %in_common ) {
    print "Phone number $phone is in both files\n";
}

この例では、existsを使用してキーがハッシュに存在するかどうかを確認していないことに注意してください。つまり、単純にif ( $phone_hash2{$phone} )代わりにif ( exists $phone_hash2{$phone} ). 最初の形式は、キーが定義されているかどうかを確認します。値が NULL 文字列または数値のゼロであっても同様です。

2 番目の形式は、値が 0、null 文字列、または未定義でない限り true になります。意図的にハッシュの値を に設定したので、1この形式を使用できます。exists有効な値が NULL 文字列またはゼロである可能性がある状況があるため、これを使用するのは良い習慣です。ただし、可能な場合は使用せずにコードを読み取る方法を好む人もいますexists

于 2013-05-24T21:37:35.343 に答える