Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 计算两个文件之间行的更改数_Perl_Unix_Diff - Fatal编程技术网

Perl 计算两个文件之间行的更改数

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"); } 我们

我希望得到两个文件之间已更改的行数。 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");
}
我们应该看到,有一个修改计数

任何帮助都将不胜感激

编辑----

对不起,伙计们,我知道你们是从哪里来的。 所以我想知道的是,当一条线改变时,例如 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
和其他工具实际上只适用于删除/插入-每个“更改”行通常被识别为删除旧版本并插入新版本。。。