-5

我有 list1.txt 连续 100 个名称我想从 list2.txt 中获取他们的电子邮件,其中包含 1000 个带有类似电子邮件的名称(名称:电子邮件) 逐个搜索名称非常累,所以我想得到继续我的 100 个姓名的姓名和电子邮件的行,我一键搜索,很简单

list1.txt (names) 我的 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

ETC

请我需要完整的代码因为我没有关于 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

3

对于第二个文件中的每一行,您要查找该行中的名称是否在第一个文件中找到。

  1. 对于第二个文件中的每一行,
    1. 从行中提取名称。
    2. 如果名称出现在第一个文件中,
      1. 打印该行。

这可以通过首先创建一个由第一个文件中找到的名称作为键的哈希来有效地完成。

  1. 创建一个哈希。
  2. 对于第一个文件中的每一行,
    1. 从行中提取名称。(即删除尾随换行符。)
    2. 在以名称为键的散列中创建一个元素。
于 2013-06-01T20:54:28.557 回答
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 回答
0

只需在 bash 中执行

#!/bin/bash
namefile="./namefile"
bigfile="./bigemailfile"

while read name
do
    grep "^$name:" "$bigfile"
done < "$namefile"

或对两个文件进行排序,例如

sort -o list1.txt list1.txt
sort -o list2.tst list2.txt

并简单地使用:

join -t: list1.txt list2.txt

嗯..没关系 - 从你的评论我理解比你使用 Windows 而不是 unix ......

于 2013-06-01T21:26:12.897 回答