我有两个文件,一个有代码列表,另一个有代码列表,有管道分隔。
例如:)文件1:
00001
00002
00001
00003
00002
00004
文件2:*注意某些名称可能是名称1 1等。请参阅下面的新示例:
00001 | name1 1 1
00002 | name2 2
00003 | name3 3 3 3
00004 | name4 4 4 4 4
我需要输出在文件1中保留相同的结构,但是从文件2中获取名称,如下所示:
输出文件:
00001 | name1 1 1
00002 | name2 2
00001 | name1 1 1
00003 | name3 3 3 3
00002 | name2 2
00004 | name4 4 4 4 4
等等。我一直在使用我发现并修改的Perl脚本来从第一个文件中逐行找到匹配项:
#!/usr/bin/perl -w
use strict;
#FindTextInFile.pl
my ($names, $data) = ("codesonly.txt", "codeandtext.txt");
open (FILE1, $names) || die;
open (FILE2, $data) || die;
undef $/; #Enter "file-slurp mode" by emptying variable indicating end-of-record
my $string = <FILE2>; #Read entire file to be searched into a string variable
$/ = "\n"; #Restore default value to end-of-record variable
while (<FILE1>) {
chomp; #remove new-line character from end of $_
#Use quotemeta() to fix characters that could spoil syntax in search pattern
my $qmname = quotemeta($_);
if ($string =~m/$qmname/i) {
print " $_ \n";
}
else {
}
}
我也一直在Windows CMD命令中使用FINDSTR功能,但不会为我逐行输出。我对PERL很新,所以任何帮助都会很棒,或者如果有更简单的方法可以做到这一点非常有帮助。我将使用的文件是〜1M行,所以我需要一些快速的东西。
由于
答案 0 :(得分:2)
使用哈希值来快速轻松查找。
my %rows;
{
open(my $names_fh, '<', $names_qfn)
or die("Can't open \"$names_qfn\": $!\n");
while (<$names_fh>) {
my ($id) = /^(\S+)/;
$rows{$id} = $_;
}
}
{
open(my $index_fh, '<', $index_qfn)
or die("Can't open \"$index_qfn\": $!\n");
while (<$index_fh>) {
chomp;
print($rows{$_});
}
}
答案 1 :(得分:0)
或许这样的事情?
use strict;
use warnings;
my %codes = do {
local $/;
open my $fh, '<', 'f2.txt' or die $!;
<$fh> =~ /\w+/g;
};
open my $fh, '<', 'f1.txt' or die $!;
while (<$fh>) {
my ($key) = /(\w+)/;
print "$key | $codes{$key}\n";
}
<强>输出强>
00001 | name1
00002 | name2
00001 | name1
00003 | name3
00002 | name2
00004 | name4
答案 2 :(得分:0)
感谢大家的回复。我能够用这段代码做我需要的。
open(file1, "<file1.txt");
open(file2, "<file2.txt");
while(<file2>){
my($line) = $_;
chomp $line;
my($key, $value) = $line =~ /(.+)\|(.+)/;
$file2Hash{$key} = $value;
}
while(<file1>){
my($line) = $_;
chomp $line;
if(exists $file2Hash{$line}){print $line." | ".$file2Hash{$line}."\n";}
else{print $line." | "."Error - Key not found in hash\n";}
}