Busca recursivamente arquivos que possuem uma porcentagem de linhas em comum

1

É possível encontrar recursivamente arquivos com uma porcentagem de linhas em comum?

Eu quero uma saída em que eu tenha apenas arquivos que sejam 50% iguais aos outros ou que tenham mais de 20 linhas em comum.

Estou tentando isolar funções comuns em *.java arquivos.

    
por devin 09.06.2016 / 18:15

1 resposta

1

Se você tem 200-300 arquivos, isso é um monte de comparações. Supondo que foram 200 arquivos, então você teria

200 * 199 / 2

ou 19900 comparações (consulte Como obtenho o número total de pares únicos de um conjunto no banco de dados? ).

Além de lidar com o número de combinações, você precisa de uma maneira de medir o número de linhas comuns. Você poderia usar uma abordagem como diffstat e contar o número de linhas adicionadas e excluídas, por exemplo, em um script de shell, e tratar isso como alterar , subtrair do tamanho do arquivo para obter linhas inalteradas :

#!/bin/sh
change=$(diff "$1" "$2" | grep '^[<>]' | wc -l)
change=$(expr $change / 2)
size1=$(wc -l "$1"| awk '{print $1;}')
size2=$(wc -l "$2"| awk '{print $1;}')
unchanged1=$(expr $size1 - $change)
unchanged2=$(expr $size2 - $change)
[ $unchanged1 -gt 20 ] && echo "$unchanged1 unchanged lines in $1 vs $2"

Neste exemplo, eu calculei, mas não usei o valor unchanged2 (os números não precisam ser os mesmos, e confundir o relatório pode torná-lo menos legível).

Mas isso é apenas para ilustrar a abordagem: gerenciar as 20 mil comparações irá mantê-lo ocupado. Por exemplo, você pode fazer o script de exemplo produzir resultados formatados como um arquivo CSV:

[ $unchanged1 -gt 20 ] && echo "$unchanged1,\"$1\",\"$2\""
[ $unchanged2 -gt 20 ] && echo "$unchanged2,\"$2\",\"$1\""

e (chamando compare-files ), use isso como

#!/bin/sh
echo "CHANGES,FILE1,FILE2" >report.csv
for file1 in *
do
    echo "comparing $file1" >&2
    for file2 in *
    do
        compare-files "$file1" "$file2" >>report.csv
    done
done
    
por 01.10.2016 / 04:02