Bash 스크립트는 특정 입력에서만 작동합니다.

Bash 스크립트는 특정 입력에서만 작동합니다.

나는 한동안 작업해온 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로 변경 하면 len1-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줄로 추정하면 됩니다.≥42len=10len=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줄의 두 배만 나타나는 이유입니다.

관련 정보