在第一个文件中按列表合并两个文本文件,并在输出中保留相同的列表

时间:2012-03-08 22:59:24

标签: perl

我有两个文件,一个有代码列表,另一个有代码列表,有管道分隔。

例如:)文件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行,所以我需要一些快速的东西。

由于

3 个答案:

答案 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";}
    }