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

时间:2014-05-30 14:38:35

标签: perl unix diff

我希望获得两个文件之间已更改的行数。 diff / diffstat没有给我正确的结果。

例如,如果file1看起来像 -

if(x==2){
    System.out.println("TEST");
}
if(y==2){
}
System.out.println("finished");

和file2看起来像

if(x==2){
    System.out.println("TEST22");
}
if(y==2){
    System.out.println("second");
}

我们应该看到有一个修改计数。

任何帮助都将不胜感激。

EDIT ----

抱歉,伙计们,我明白你的来源。 所以我想知道的是例如当一条线发生变化时 System.out.println(“TEST”) - >的System.out.println( “TEST2”);

但是我们还有一个已插入的行和另一行已被删除的行。 在diff / diffstat中,它将插入和删除计为修改,但我不想这样做。

1 个答案:

答案 0 :(得分:1)

区别在于:

@@ -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