특정 비율의 공통 라인을 갖는 파일을 반복적으로 찾는 것이 가능합니까?
다른 파일과 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