递归查找具有一定百分比的共同行的文件

递归查找具有一定百分比的共同行的文件

是否可以递归地查找具有一定百分比的共同行的文件?

我想要一个输出,其中只有与其他文件有 50% 相同或有 20 多行共同点的文件。

我正在尝试隔离*.java文件中的常见功能。

答案1

如果您有 200-300 个文件,则需要进行大量比较。假设有 200 个文件,那么您将有

200 * 199 / 2

或 19900 次比较(参见如何获取数据库中一组唯一对的总数?)。

除了处理组合数量之外,您还需要一种方法来测量公共线的数量。你可以diffstat使用类似于计算添加和删除行数的方法,例如在 shell 脚本中,并将其视为改变,从文件大小中减去它即可得到不变线路:

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

在此示例中,我计算了但没有使用该unchanged2值(数字不必相同,并且报告混乱可能会降低其可读性)。

但这只是为了说明该方法:管理 2 万次比较会让您很忙。例如,您可以使示例脚本生成格式为 CSV 文件的结果:

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

并且(称之为compare-files),像这样使用

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

相关内容