2010-04-27 57 views
7

使用diff显示两个文件之间的百分比差异的好方法是什么?百分比值与GNU差异

例如,如果一个文件有100行,并且一个副本有15行已被更改,diff-percent将为15%。

+1

您可以使用sdiff并计算分隔符,然后除以行数。 – MJB 2010-04-27 16:20:26

+0

diff fileA fileB | wc -l 除以wc -l fileA //似乎是一个有趣的手动方式来完成它。 – cdated 2010-04-27 16:28:36

+0

但问题是,如果有差异,你会得到3行 - orig,new和description。所以你可能会高估。来自wc的man文件的 – MJB 2010-04-27 17:27:01

回答

6

也许这样的事情?

两个文件,A1和A2。

$ sdiff -B -b -s A1 A2 | wc会给你多少行不同。 wc给出总数,只是划分。

-b和-B将忽略空白和空行,并且-s表示禁止公用行。

+2

:换行符,单词和字节。 您将输出中的第一个数字除以文件中的行数进行比较。 wc -l,只给你一些行数,可以添加到上面的命令中。 - 回复AlligatorJack – cdated 2010-06-14 14:42:07

+0

@cdated:谢谢澄清。直到您评论为止,我才看到问题/回应。 – MJB 2010-06-14 15:01:05

2

这里有一个脚本,将比较所有.txt文件,并显示有超过15%的重复的那些:

#!/bin/bash 

# walk through all files in the current dir (and subdirs) 
# and compare them with other files, showing percentage 
# of duplication. 

# which type files to compare? 
# (wouldn't make sense to compare binary formats) 
ext="txt" 

# support filenames with spaces: 
IFS=$(echo -en "\n\b") 

working_dir="$PWD" 
working_dir_name=$(echo $working_dir | sed 's|.*/||') 
all_files="$working_dir/../$working_dir_name-filelist.txt" 
remaining_files="$working_dir/../$working_dir_name-remaining.txt" 

# get information about files: 
find -type f -print0 | xargs -0 stat -c "%s %n" | grep -v "/\." | \ 
    grep "\.$ext" | sort -nr > $all_files 

cp $all_files $remaining_files 

while read string; do 
    fileA=$(echo $string | sed 's/.[^.]*\./\./') 
    tail -n +2 "$remaining_files" > $remaining_files.temp 
    mv $remaining_files.temp $remaining_files 
    # remove empty lines since they produce false positives 
    sed '/^$/d' $fileA > tempA 

    echo Comparing $fileA with other files... 

    while read string; do 
     fileB=$(echo $string | sed 's/.[^.]*\./\./') 
     sed '/^$/d' $fileB > tempB 
     A_len=$(cat tempA | wc -l) 
     B_len=$(cat tempB | wc -l) 

     differences=$(sdiff -B -s tempA tempB | wc -l) 
     common=$(expr $A_len - $differences) 

     percentage=$(echo "100 * $common/$B_len" | bc) 
     if [[ $percentage -gt 15 ]]; then 
      echo " $percentage% duplication in" \ 
       "$(echo $fileB | sed 's|\./||')" 
     fi 
    done < "$remaining_files" 
    echo " " 
done < "$all_files" 

rm tempA 
rm tempB 
rm $all_files 
rm $remaining_files