我試圖寫一個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
我試圖寫一個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
隨着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
}
得到這樣的輸出:(幾乎接近它似乎,每個是/否後第一個字符追加) noa 是 noc 點頭 – Ram 2015-03-25 10:54:13
我真的看不到你的實際輸出是從評論。你可以用'\ n'而不是換行符再次發佈它,所以我可以看到行的開始和結束? – Wintermute 2015-03-25 11:01:54
noa \ n 是\ n noc \ n 點頭\ n – Ram 2015-03-25 11:02:47
在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;
,但我不知道如果行開頭的空格是格式化,填充或實際重要,所以我沒有碰它。
'file2'保證是'file1'的子集嗎?如果不是,那麼出現在'file2'中但不出現在'file1'中的行的預期輸出是什麼? – Wintermute 2015-03-25 10:20:15
是的,file2保證是file1的一個子集 – Ram 2015-03-25 10:25:02
爲什麼不使用'diff'? – choroba 2015-03-25 10:27:53