我正在尝试找到以下问题的解决方案。我有两组文件:
- 文件夹 A 包含大约 400 个文本文件。
- 文件夹 B 的几个子文件夹中总共有大约 20,000 个文本文件。
文件夹 A 中的文件要么是文件夹 B 中文件的修改版本,要么是文件夹 B 中文件的一部分。当我说“部分”时,我的意思是文件夹 A 中的文件可能包含文件夹 B 中文件的部分文本,但不是全部。
我想要匹配这些对,即对于文件夹 AI 中的每个文件,想要找到文件夹 B 中与文件夹 A 中的文件最相似的一个或多个文件。
例如,我想要以下类型的报告:
File ./A/foo123.txt most closely matches file ./B/bar243.txt with 68% of lines identical.
File ./A/bar306.txt most closely matches file ./B/foo85.txt with 30% of lines identical.
我可以使用命令行工具来实现此结果吗?或者最好的方法是什么?
答案1
像这样的事情会起作用:
for fa in A/*; do
highest_pm=0
for fb in B/*; do
num_identical_lines=$(diff --unchanged-group-format='%<' --old-group-format='' --new-group-format='' --changed-group-format='' "$fa" "$fb" | wc -l)
num_lines_file_a=$(wc -l < "$fa")
# save permille of matching lines
pm=$((1000*num_identical_lines/num_lines_file_a))
# compare with highest permille
if [ $pm -gt $highest_pm ]; then
highest_pm=$pm
best_match="$fb"
fi
done
# output
[ $highest_pm -gt 0 ] \
&& printf "File %s best matches File %s with %d %% of identical lines.\n" "$fa" "$best_match" $((highest_pm/10)) \
|| printf "File %s has no match\n" "$fa"
done
num_identical_lines 的评估为基于这个答案。
剩下的只是文件循环、一些比较和一些输出;-)
输出:
File A/file2 has no match
File A/filea best matches File B/fileb with 50 % of identical lines.