Eu tenho um script bash no qual estou trabalhando há um tempo. Basicamente, ele pesquisa no texto para encontrar repetições de várias linhas. Aqui está o que eu tenho até agora:
#!/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
Descobri que isso funciona corretamente em um arquivo simples que tem os números de 1 a 10 repetidos duas vezes (assim):
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
Com isso, ele produzirá corretamente 1 (com a len
variável em 10). Quando a len
variável é alterada para 9, ela produzirá corretamente dois, porque 1-9 e 2-10 são 9 padrões de linha que ocorrem pelo menos duas vezes.
No entanto, quando executo isso nos meus arquivos de destino (um exemplo pode ser encontrado aqui ), recebo resultados impossíveis.
Neste script, a quantidade de padrões de nove linhas encontrados sempre terá que ser pelo menos o dobro da quantidade de padrões de dez linhas. Veja o exemplo acima de 1-10. Nisso, 1-10 é o único padrão de dez linhas. No entanto, dentro dele estão 1-9 e 2-10, ambos repetidos duas vezes. Porém, quando executo meu script, para padrões repetidos de dez linhas, obtenho uma saída de 2 e, para padrões de nove linhas, também obtenho uma saída de 2. Isso é claramente incorreto. Por que isso está acontecendo?
Nota - a fileprep
variável foi criada para criar uma lista de números do arquivo de entrada (veja o arquivo de exemplo que vinculei).
O fenômeno que você descreve na verdade não é impossível, então seu script não é o problema. O menor exemplo que posso pensar é com
len=3
em oposição alen=2
, e o arquivo de entrada éCom
len=3
, você obtém o resultado2
, mas comlen=2
, você não obtém algum número≥4
como talvez suspeitasse, mas novamente o resultado2
. Para obter o mesmo número de padrões de repetição distintos comlen=10
e comlen=9
, você só precisa extrapolar o arquivo para 13 linhas.Termo aditivo:
Modifiquei a
count()
função paraPortanto, imprime o padrão que se repete na saída de erro padrão. Diz que o padrão de 10 linhas
aparece 360 vezes, enquanto o padrão de 10 linhas
aparece duas vezes. Por outro lado, o padrão de 9 linhas
aparece 362 vezes, enquanto
aparece duas vezes. Seu arquivo contém muitos blocos de linhas subsequentes com extensão
16
. O que me intriga é por que as 9 linhas com16
não ocorrem mais uma vez para cada um desses blocos, mas apenas duas vezes mais do que as 10 linhas no total.