我正在使用Perl在批处理文件中调用2个大型CSV文件。 我把结果放在第3档。
目前该文件包含其他信息,如标题,以及其他类似的行:
--- file1.txt Wed Mar 7 14:57:10 2018
+++ file2.txt Wed Mar 7 13:56:51 2018
@@ -85217,4 +85217,8 @@
结果文件如何仅包含差异? 谢谢。
这是我的perl:
#!/usr/bin/env perl
use strict; use warnings;
use Text::Diff;
my $diffs = diff 'file1.txt' => 'file2.txt';
print $diffs;
这是我的批处理文件:
perl diffperl.pl > newperl.csv
答案 0 :(得分:1)
您应该查看the documentation for Text::Diff中的STYLE
选项。内置样式之一可能更符合您的喜好。但如果情况并非如此,您可以编写自己的格式化包。听起来像你只需要提供一个返回空字符串的hunk_header()
方法(因为它是你不喜欢的hunk标题行)。
答案 1 :(得分:1)
统一格式
@
”开头的行表示文件中差异的位置。-
”开头的行表示仅在第一个文件中的行。+
”开头的行表示仅在第二个文件中的行。\ No newline at end of file
”行。解决方案:
$diffs =~ s/^(?:[^\n]*+\n){2}//;
$diffs =~ s/^[\@ \\][^\n]*+\n//mg;
请注意,添加CONTEXT => 0
会减少要删除的行数。
也就是说,如果你想要自己的输出格式,使用Text::Diff没什么意义。您也可以直接使用Algorithm::Diff。
use Algorithm::Diff qw( traverse_sequences );
my $qfn1 = 'file1.txt';
my $qfn2 = 'file2.txt';
my @file1 = do { open(my $fh, '<', $qfn1) or die("Can't open \"$qfn1\": $!\n"); <$fh> };
my @file2 = do { open(my $fh, '<', $qfn2) or die("Can't open \"$qfn2\": $!\n"); <$fh> };
if (@lines1) { chomp($lines1[-1]); $lines1[-1] .= "\n"; }
if (@lines2) { chomp($lines2[-1]); $lines2[-1] .= "\n"; }
traverse_sequences(\@lines1, \@lines2, {
DISCARD_A => sub { print("-", $lines1[$_[0]]); },
DISCARD_B => sub { print("+", $lines2[$_[1]]); },
});