-5

list1.txt には 100 個の名前が含まれています。リスト 2.txt からそれらのメールを取得したいのですが、そのメールには 1000 個の名前とそのようなメール (name : email) が含まれています。名前を 1 つずつ検索するのは非常に面倒なので、ワンクリックで検索した 100 の名前の名前とメールを続ける行

list1.txt (名前) 私の 100 のリスト

name1
name2
name3
etc

list2.txt (name : email) マイリスト名のメールを抽出したい大きなリスト

name2:whatever@gmail.com
name1:whatever@gmail.com
name3:whatever@gmail.com
name4:whatever@gmail.com
name5:whatever@gmail.com

だから私は名前を含む行を印刷したい(name1とname2とname 3.etc)

name1:whatever@gmail.com
name2:whatever@gmail.com
name3:whatever@gmail.com

完全なコードが必要です。perl に関する情報がまったくないため、スクリプトの使用方法についてどうもありがとう

私はこれを試しましたが、一致する行を印刷するだけで機能しません

#! /usr/local/bin/perl 
# compare 
my $f1 = "list1.txt";
my $f2 = "list2.txt";
my $outfile = "result.txt";
my %results = (); 

open FILE1, "$f1" or die "Could not open file: $! \n";
while(my $line = <FILE1>){
   $results{$line}=1;
}
close(FILE1); 

open FILE2, "$f2" or die "Could not open file: $! \n";
while(my $line =<FILE2>) {  
   $results{$line}++;
}
close(FILE2);  

open (OUTFILE, ">$outfile") or die "Cannot open $outfile for writing \n";
foreach my $line (keys %results) {
   print OUTFILE " $results{$line} - $line" if $results{$line} != 1;
}
close OUTFILE;
4

4 に答える 4

1

これを試して :

grep -f list1.txt list2.txt
于 2013-06-01T22:24:46.420 に答える
1

参考までに投稿するだけです。使えない方はご遠慮くださいawk

awk -F: 'NR==FNR {a[$1];next} $1 in a' list1.txt list2.txt

テスト:

[jaypal:~/Temp] cat list1.txt
name1
name2
name3
[jaypal:~/Temp] cat list2.txt
name2:whatever@gmail.com
name1:whatever@gmail.com
name3:whatever@gmail.com
name4:whatever@gmail.com
name5:whatever@gmail.com
[jaypal:~/Temp] awk -F: 'NR==FNR {a[$1];next} $1 in a' list1.txt list2.txt
name2:whatever@gmail.com
name1:whatever@gmail.com
name3:whatever@gmail.com

Perl の解決策: 免責事項 - 私はあまり perl を知りません。@ikegamiの提案に従って、次のことを思いつきました。

#!/usr/local/bin/perl

use strict;
use warnings;

open my $LOOKUP, "<", "list1.txt" or die "Cannot open lookup file: $!";
open my $MASTER, "<", "list2.txt" or die "Cannot open Master file: $!";

my %names;
while (my $name = <$LOOKUP>) {
    chomp($name);
    ++$names{$name};
}

while (my $line = <$MASTER>) {
    my ($name) = split(/:/, $line);
    print $line if $names{$name};
} 
于 2013-06-01T21:48:38.870 に答える