2010-04-27 19 views
7

¿Cuál es un buen método para usar diff para mostrar una diferencia porcentual entre dos archivos?Valor porcentual con GNU Diff

Como si un archivo tiene 100 líneas y una copia tiene 15 líneas que se han cambiado, el porcentaje de diferencia sería del 15%.

+1

Puede usar sdiff y contar los separadores, luego dividir por el número de líneas. – MJB

+0

diff archivoA archivoB | wc -l dividido por wc -l archivo A // parece ser una forma manual interesante de hacerlo. – cdated

+0

Pero el problema sería que cuando hay una diferencia, obtienes 3 líneas: original, nueva y descripción. Entonces probablemente sobreestimarías. – MJB

Respuesta

6

¿Algo así como esto?

Dos archivos, A1 y A2.

$ sdiff -B -b -s A1 A2 | wc le daría la cantidad de líneas diferentes. wc da total, solo divide.

Las opciones -b y -B ignoran los espacios en blanco y las líneas en blanco, y -s indica que se suprimen las líneas comunes.

+2

del archivo man de wc: líneas nuevas, palabras y bytes. divide el primer número en el resultado por el número de líneas en el archivo que está comparando. wc -l, le da solo el número de líneas y puede agregarse al comando de arriba. - Respuesta a AlligatorJack – cdated

+0

@cdated: gracias por aclarar. No vi la pregunta/respuesta, por supuesto, hasta que lo comentaste. – MJB

2

Aquí hay un script que comparará todos los archivos .txt y mostrar los que tienen más de un 15% la duplicación:

#!/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