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)。当len变量更改为 9 时,它将正确输出 2,因为 1-9 和 2-10 都是至少出现两次的 9 行模式。

但是,当我在目标文件上运行它时(可以找到一个示例这里),我得到了不可能的结果。

在此脚本中,找到的九线图案的数量始终必须至少是十线图案数量的两倍。以上面的1-10为例。其中,1-10 是唯一的十线模式。然而,其中既有1-9又有2-10,两者都重复了两次。但是,当我运行脚本时,对于十行重复模式,我得到的输出为 2,对于九行模式,我也得到的输出为 2。这显然是不正确的。为什么会发生这种情况?

注意 -fileprep创建变量是为了从输入文件创建数字列表(请参阅我链接的示例文件)。

答案1

你描述的现象其实也不是不可能,所以你的脚本不是问题。我能想到的最小的例子是与len=3相对len=2,输入文件是

1
2
1
2
1
2

使用len=3,您会得到结果2,但是使用len=2,您不会得到≥4您可能怀疑的一些数字,而是再次得到结果2。为了获得与len=10和相同数量的不同重复模式len=9,您只需将文件推断为 13 行。

附录:

我将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 行的两倍。

相关内容