我有一个 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 行的两倍。