Perl 计算两个文件之间行的更改数
我希望得到两个文件之间已更改的行数。 diff/diffstat没有给我正确的结果 例如,如果file1看起来像-Perl 计算两个文件之间行的更改数,perl,unix,diff,Perl,Unix,Diff,我希望得到两个文件之间已更改的行数。 diff/diffstat没有给我正确的结果 例如,如果file1看起来像- if(x==2){ System.out.println("TEST"); } if(y==2){ } System.out.println("finished"); 文件2看起来像 if(x==2){ System.out.println("TEST22"); } if(y==2){ System.out.println("second"); } 我们
if(x==2){
System.out.println("TEST");
}
if(y==2){
}
System.out.println("finished");
文件2看起来像
if(x==2){
System.out.println("TEST22");
}
if(y==2){
System.out.println("second");
}
我们应该看到,有一个修改计数
任何帮助都将不胜感激
编辑----
对不起,伙计们,我知道你们是从哪里来的。
所以我想知道的是,当一条线改变时,例如
System.out.println(“TEST”)->System.out.println(“TEST2”)
但我们还有一行已经插入,另一行已经删除。
在diff/diffstat中,它将插入和删除视为修改,但我不希望这样做。区别在于:
@@ -2 +2 @@
- System.out.println("TEST");
+ System.out.println("TEST22");
@@ -4,0 +5 @@
+ System.out.println("second");
@@ -6 +6,0 @@
-System.out.println("finished");
如果要计算更改的行组,这很简单
$ diff -u0 file1 file2 | tail -n +3 | grep '^@' | wc -l
3
如果将编辑计算为删除加上添加,也很简单
$ diff -u0 file1 file2 | tail -n +3 | grep -v '^@' | wc -l
4
如果将编辑的行计算为单个更改,则更为复杂
$ diff -u0 file1 file2 | tail -n +3 | perl -e'
use strict;
use warnings;
use List::Util=min qw( min );
my $diffs = 0;
my $dels = 0;
my $adds = 0;
while (<>) {
++$adds, next if /^\+/;
++$dels, next if /^-/;
$diffs += $adds + $dels - min($dels, $adds);
$dels = 0;
$adds = 0;
}
$diffs += $adds + $dels - min($dels, $adds);
print("$diffs\n");
'
3
$diff-u0 file1 file2 | tail-n+3 | perl-e'
严格使用;
使用警告;
使用列表::Util=minqw(min);
我的$diff=0;
我的$dels=0;
我的$adds=0;
而(){
++$adds,下一个if/^\+/;
++$dels,下一个if/^-/;
$diff+=$adds+$dels-min($dels,$adds);
$dels=0;
$adds=0;
}
$diff+=$adds+$dels-min($dels,$adds);
打印($diff\n);
'
3.
您的示例中有三行不同。我看到了三个不同之处:一行更改(第2行)、一行添加(第4行之后)和一行删除(第6行)。您是想计算更改的行数,还是抽象意义上的“更改”数?正如其他评论所指出的,在您的示例中有三行发生了更改。但这在概念上可能是一个“变化”。在正确的设置下,diff
可能会打印出一个更改“chunk”-可以通过对输出进行一些后处理来计算chunk。。。另外,如果(y==2){}
是毫无意义的…根据您的更新-您对“更改”行与删除/插入之间的区别的阈值是什么?如果System.out.println(“测试”)
更改为exit(1)
,该怎么办?这是“更改”行还是删除/插入?一般来说,diff
和其他工具实际上只适用于删除/插入-每个“更改”行通常被识别为删除旧版本并插入新版本。。。