特定の割合の共通行を持つファイルを繰り返し探します。

特定の割合の共通行を持つファイルを繰り返し探します。

特定の割合の共通行を持つファイルを繰り返し検索することは可能ですか?

他のファイルと50%同一または共通行が20個以上のファイルのみを出力したいと思います。

*.javaファイルから共通機能を分離しようとしています。

ベストアンサー1

200〜300個のファイルがある場合は、多くの比較を実行する必要があります。 200個のファイルがあると仮定すると

200 * 199 / 2

または19900の比較(参照)データベースのユニークなペアの総数を取得するには?)。

結合された数量を処理することに加えて、共通ライン数を測定する方法も必要です。あなたできるdiffstatたとえば、シェルスクリプトで追加および削除された行数を数えるなど、次のように処理します。変化、ファイルサイズからそれを引くと次のようになります。絶え間ないライン:

#!/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数値が同じである必要はなく、レポートが複雑になると読みやすくなる可能性があります。

しかし、これは単なるアプローチを説明するためのものです。 20,000の比較を管理すれば忙しくなります。たとえば、サンプルスクリプトに結果を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

おすすめ記事