나는 한동안 작업해온 bash 스크립트를 가지고 있습니다. 기본적으로 여러 줄에 걸쳐 중복된 텍스트를 검색합니다. 이것이 내가 지금까지 가지고 있는 것입니다:
#!/bin/bash
count() {
count=$(( $3 - $2 + 1 ))
pattern=$(echo "$1" | head -n $3 | tail -n $count)
echo "$1" | pcregrep -Mc "^\Q$(echo "$pattern")\E$"
}
file=$1
fileprep=$(grep -v '=' $file | grep -v '!' | grep -v '*' | grep -o '[[:digit:]]*' | grep . )
linecount=$(echo "$fileprep" | wc -l)
len=10
start=1
end=$(( $linecount - $len + 1 ))
for i in $(seq $start $end); do
test="$test\n$(count "$fileprep" $i $((i+len-1)))"
done
a=$(printf $test | grep -v '\b1\b' )
mostrepetitions=$(echo "$a" | sort -rn | head -n1)
for i in $(seq 1 $mostrepetitions); do
var1=$(printf "$a" | grep '\b'$i'\b' | wc -l)
var2="$var2\n$(echo $(( var1 / i )))"
done
printf "$var2" | tr '\n' '+' | awk '{print "0"$0}' | bc -l
나는 이것이 1-10의 숫자가 두 번 반복되는 간단한 파일에서 잘 작동한다는 것을 알았습니다(아래 참조).
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
이 시점에서는 올바르게 1(변수 len
는 10)을 출력합니다. 변수를 9로 변경 하면 len
1-9와 2-10이 모두 2번 이상 발생하는 9줄 패턴이므로 2가 올바르게 출력됩니다.
그러나 대상 파일에서 실행하면(예제를 찾을 수 있습니다)여기), 불가능한 결과가 나타납니다.
이 스크립트에서 발견된 9줄 패턴 수는 항상 10줄 패턴 수의 두 배 이상이어야 합니다. 위의 1~10을 예로 들어 보겠습니다. 그 중 1~10이 유일한 10행 모드이다. 그런데 그 안에는 1-9와 2-10이 모두 들어 있는데, 둘 다 두 번 반복됩니다. 그러나 스크립트를 실행하면 10줄 반복 패턴에 대해 2가 출력되고 9줄 패턴에 대해서도 2가 출력됩니다. 이것은 분명히 잘못된 것입니다. 왜 이런 일이 발생합니까?
참고 - fileprep
변수는 입력 파일에서 숫자 목록을 생성하기 위해 생성됩니다(링크된 예제 파일 참조).
답변1
귀하가 설명하는 현상은 실제로 불가능하지 않으므로 스크립트에 문제가 없습니다. 내가 생각할 수 있는 가장 작은 예는 len=3
상대를 사용하는 것입니다 len=2
. 입력 파일은 다음과 같습니다.
1
2
1
2
1
2
을 사용하면 len=3
결과를 얻을 수 2
있지만 을 사용하면 의심할 수 있는 일부 숫자를 len=2
얻지 못하지만 다시 결과를 얻을 수 있습니다 . 및 와 동일한 수의 서로 다른 반복 패턴을 얻으려면 파일을 13줄로 추정하면 됩니다.≥4
2
len=10
len=9
부록:
count()
기능을 다음으로 수정했습니다 .
count() {
count=$(( $3 - $2 + 1 ))
pattern=$(echo "$1" | head -n $3 | tail -n $count)
occur=$(echo "$1" | pcregrep -Mc "^\Q$(echo "$pattern")\E$")
[ $occur -ge 2 ] && echo "$pattern occurs $occur times." >&2
echo $occur
}
따라서 표준 오류 출력에 반복되는 패턴을 인쇄합니다. 10줄 모드라고 써있어요
16
...
16
360번 등장, 10줄 패턴
16
...
16
8
두 번 나타납니다. 반면에 9라인 패턴은
16
...
16
362번 등장했지만
16
...
16
8
두 번 나타납니다. 파일에는 후속 행의 많은 블록이 포함되어 있습니다 16
. 나를 혼란스럽게 하는 것은 각 블록의 9줄이 16
다시 나타나지 않고 총 10줄의 두 배만 나타나는 이유입니다.