我有list1.txt contine 100个名字 我想从list2.txt中获取包含1000个姓名的电子邮件,其中包含类似电子邮件的名称(姓名:电子邮件) 它很累,一个接一个地搜索名字 所以我想得到的行继续我的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以及名称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;
答案 0 :(得分:3)
对于第二个文件中的每一行,您要查找是否在第一个文件中找到该行中的名称。
首先创建一个由第一个文件中的名称键入的哈希值,可以有效地完成。
答案 1 :(得分: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
#!/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};
}
答案 2 :(得分:1)
试试这个:
grep -f list1.txt list2.txt
答案 3 :(得分: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 ...