是否可以递归地查找具有一定百分比的共同行的文件?
我想要一个输出,其中只有与其他文件有 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