2013-07-17 117 views
1

我在這裏有兩個文件(文件1 &文件2)。我想從兩個文件中匹配如下所示的粗體名稱。不過,我需要以文件1格式打印這些不匹配的數據。我一直在嘗試下面的代碼,但它不是我想要的結果。如何在匹配後以文件1格式打印那些不匹配的數據?如何在比較兩個文件後打印不匹配的數據?

文件1

ID **alan135/xkr** $work(b05bfn00un0c3)/b05bfn00un0c3 ; #<= b05bfn00un0d0 Size:5848.270996 
ID **John06/ext** $work(b05bfn00ld0p7)/b05bfn00ld0p7 ; #<= b05bfn00ld0s0 Size:INFINITY  
ID **lily099/poli** $work(b05bfn00ld0p7)/b05bfn00ld0p7 ; #<= b05bfn00ld0s0 Size:INFINITY 
ID **sam012/pp** $work(b05bfn00ld0p7)/b05bfn00ld0p7 ; #<= b05bfn00ld0s0 Size:INFINITY 
ID **lily099/poli** $wwrk(b05bfn00ld0p8)/b05bfn00ld0p8 ; #<= b05bfn00ld0s0 Size:INFINITY 
ID **Steve9018** $work(b05bfn00ld0p7)/b05bfn00ld0p7 ; #<= b05bfn00ld0s0 Size:INFINITY 

文件2

Accept => **John06/ext** Max 
Accept => **vivian788/ppr** Maxcap 
Accept => **suzan645/pp** Min 
Accept => **lily099/poli** Max 
Accept => **Nick5670/uu** Max 
Accept => **Anne309/pej** Min 

代碼

my ($line1,$line2,@arr1,@arr2,@arr3,@emptyarr); 
@arr1 = <FILE1>; 
@arr2 = <FILE2>; 
foreach $line2 (@arr2) { 
    if ($line2 =~ m/(.*)\s+(.*)\s+(.*)\s+(.*)/) { 
     @arr3 = @emptyarr;  
     my $cname2 = "$2"; 
     push (@arr3, $cname2); 
    } 
} 

foreach $line2 (@arr3) { 
    foreach $line1 (@arr1) { 
     if ($line1 =~ m/(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)\s+(.*)/) { 
      my $cname1 = "$2"; 
      if ($cname1 ne $line3) {  
       print NL "$cname1\n"; 
      } 
     } 
    }  
} 

預期的結果:

ID alan135/XKR $ WOR k(b05bfn00un0c3)/ b05bfn00un0c3; #< = b05bfn00un0d0大小:5848.270996
ID sam012/pp $ work(b05bfn00ld0p7)/ b05bfn00ld0p7; #< = b05bfn00ld0s0大小:INFINITY
ID Steve9018 $ work(b05bfn00ld0p7)/ b05bfn00ld0p7; #< = b05bfn00ld0s0大小:INFINITY

+0

你會發現它更容易將代碼粘貼在(適當的縮進),然後使用「{}」按鈕在編輯器上對代碼進行格式化,而不是在每行代碼上使用「'」。 – 2013-07-17 03:20:41

回答

1

這是爲我工作。你可以用你的數組替換split('\ n',...)。

use strict; 
use warnings; 

my $file1 = <<'FILE'; 
ID **alan135/xkr** $work(b05bfn00un0c3)/b05bfn00un0c3 ; #<= b05bfn00un0d0 Size:5848.270996 
ID **John06/ext** $work(b05bfn00ld0p7)/b05bfn00ld0p7 ; #<= b05bfn00ld0s0 Size:INFINITY  
ID **lily099/poli** $work(b05bfn00ld0p7)/b05bfn00ld0p7 ; #<= b05bfn00ld0s0 Size:INFINITY 
ID **sam012/pp** $work(b05bfn00ld0p7)/b05bfn00ld0p7 ; #<= b05bfn00ld0s0 Size:INFINITY 
ID **lily099/poli** $wwrk(b05bfn00ld0p8)/b05bfn00ld0p8 ; #<= b05bfn00ld0s0 Size:INFINITY 
ID **Steve9018** $work(b05bfn00ld0p7)/b05bfn00ld0p7 ; #<= b05bfn00ld0s0 Size:INFINITY 
FILE 

my $file2 = <<'FILE'; 
Accept => **John06/ext** Max 
Accept => **vivian788/ppr** Maxcap 
Accept => **suzan645/pp** Min 
Accept => **lily099/poli** Max 
Accept => **Nick5670/uu** Max 
Accept => **Anne309/pej** Min 
FILE 

for (split("\n", $file2)) { 

    /.*\*\*(.*)\*\*.*./; 
    my $id = $1; 
    for (split("\n", $file1)) { 

     if (/${id}/) { 
      print $_ . "\n"; 
     } 
    } 
} 
0

以調試模式這個腳本,類型DEBUG=1 script.pl

#!/usr/bin/env perl 

use strict; 
use warnings; 

# -------------------------------------- 

use charnames qw(:full :short ); 
use English qw(-no_match_vars); # Avoids regex performance penalty 

use Data::Dumper; 

# Make Data::Dumper pretty 
$Data::Dumper::Sortkeys = 1; 
$Data::Dumper::Indent = 1; 

# Set maximum depth for Data::Dumper, zero means unlimited 
local $Data::Dumper::Maxdepth = 0; 

# conditional compile DEBUGging statements 
# See http://lookatperl.blogspot.ca/2013/07/a-look-at-conditional-compiling-of.html 
use constant DEBUG => $ENV{DEBUG}; 

# -------------------------------------- 

# Put the file names in variables so they can be easily changed. 
my $file_name_1 = 'data1.tmp'; 
my $file_name_2 = 'data2.tmp'; 

# Read the key names from the second file. 
my %key_names =(); 
open my $fh2, '<', $file_name_2 or die "could not open $file_name_2: $OS_ERROR\n"; 
while(my $line = <$fh2>){ 
    # names are after 'Accept => ' 
    if(my ($name) = $line =~ m{ \b Accept \s* \=\> \s* (\S+) }msx){ 
    $key_names{$name} ++; 
    } 
} 
close $fh2 or die "could not close $file_name_2: $OS_ERROR\n"; 
print Dumper \%key_names if DEBUG; 

# Read the first file and store the _unmatched_ names. 
my %lines_of_unmatched =(); 
open my $fh1, '<', $file_name_1 or die "could not open $file_name_1: $OS_ERROR\n"; 
while(my $line = <$fh1>){ 
    # name after 'ID' 
    if(my ($name) = $line =~ m{ \b ID \s+ (\S+) }msx){ 
    if(! exists $key_names{$name}){ 
     push @{ $lines_of_unmatched{$name} }, $line; 
    } 
    } 
} 
close $fh1 or die "could not close $file_name_1: $OS_ERROR\n"; 
print Dumper \%lines_of_unmatched if DEBUG; 
0
use List::Compare; 

my @diffs = List::Compare->new(
    [map {/\*\*([^\*]+)\*\*/} <FILE1>], 
    [map {/\*\*([^\*]+)\*\*/} <FILE2>] 
)->get_symmetric_difference; 

print join("\n", @diffs)."\n"; 
相關問題