2015-03-25 79 views
2

我試圖寫一個Perl/awk腳本兩個文件這種格式輸出如下比較:使用Perl腳本來比較兩個文件

(截至現在,我可以diff使用 grep -Fxvf file1 file2 > file3兩個文件這是不夠的。)

注意:file1是file2的超集。

file1的:

aaaa 
bbbb 
cccc 
dddd 

file2的:

bbbb 
cccc 

預期輸出文件:

aaaa No 
bbbb yes 
cccc yes 
dddd No 
+1

'file2'保證是'file1'的子集嗎?如果不是,那麼出現在'file2'中但不出現在'file1'中的行的預期輸出是什麼? – Wintermute 2015-03-25 10:20:15

+0

是的,file2保證是file1的一個子集 – Ram 2015-03-25 10:25:02

+0

爲什麼不使用'diff'? – choroba 2015-03-25 10:27:53

回答

0

隨着AWK:

awk 'NR == FNR { a[$0]; next } { print $0, ($0 in a ? "yes" : "no") }' file2 file1 

那就是:

NR == FNR {        # while processing the first file 
    a[$0]         # (i.e., file2) just remember what you 
    next         # saw, and don't do anything else 
} 
{          # afterwards: 
    print $0, ($0 in a ? "yes" : "no") # print the line followed by "yes" or 
             # "no" depending on whether the line 
             # was seen before in file2 
} 
+0

得到這樣的輸出:(幾乎接近它似乎,每個是/否後第一個字符追加) noa 是 noc 點頭 – Ram 2015-03-25 10:54:13

+0

我真的看不到你的實際輸出是從評論。你可以用'\ n'而不是換行符再次發佈它,所以我可以看到行的開始和結束? – Wintermute 2015-03-25 11:01:54

+0

noa \ n 是\ n noc \ n 點頭\ n – Ram 2015-03-25 11:02:47

2

在Perl中

use strict; 
use warnings; 

open (my $file_2,"<", "file2.txt") or die $!; 
my %seen; 
while (my $line = <$file_2>) { 
    chomp ($line) ; 
    $seen{$line}++; 
} 

close ($file_2); 

open (my $file_1, "<", "file1.txt") or die $!; 
while (my $line1 = <$file_1>) { 
    chomp $line1; 
    print $line1, " ", $seen{$line1} ? "yes" : "no", "\n"; 
} 
close ($file_1); 

打印:

aaaa no 
    bbbb yes 
    cccc yes 
    dddd no 

您可能希望應用正則表達式來清理空白,如$line =~ s/^\s+//g;,但我不知道如果行開頭的空格是格式化,填充或實際重要,所以我沒有碰它。

+1

你測試過了嗎?我得到的輸出是'no no'。 – serenesat 2015-03-25 12:16:19

+0

輕微的錯字。修訂。 – Sobrique 2015-03-25 12:34:31